URMProcess.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. using System.IO;
  2. using System.Runtime.InteropServices;
  3. using Vinno.DataManager.Process;
  4. using Vinno.DataTypes;
  5. using Vinno.Infrastructure;
  6. using Vinno.Services.ServiceManagerImpl;
  7. using Vinno.DataManager.GraphTransform;
  8. using Vinno.Enums;
  9. using Vinno.ProcessUnits.DisplayLib;
  10. using System.Collections.Generic;
  11. using Vinno.DataManager.Infrastructure;
  12. using System;
  13. using Vinno.DataManager.Utilities;
  14. using SkiaSharp;
  15. namespace WingAIDiagnosisService.URMManage
  16. {
  17. public class URMProcess
  18. {
  19. private URMProcessAlg _urmProcessAlg;
  20. private URMProcessParams _urmProcessParams = new URMProcessParams();
  21. private URMImgBaseParam _urmImgBaseParam = new URMImgBaseParam();
  22. private URMImgDrawParam _urmImgDrawParam = new URMImgDrawParam();
  23. private URMVideoParam _urmVideoParam = new URMVideoParam();
  24. public ProcessUnitParam<URMType> _urmType;
  25. public ImagePP ImagePP { get; private set; }
  26. private bool Mixflag;
  27. private DPoint[] urmTraceDPoints;
  28. private byte[] imagePixels;
  29. private int ScreenWidth;
  30. private int ScreenHeight;
  31. private GCHandle handle;
  32. private ColorTable videoColorTable;
  33. public bool init(string familyName, string typeInfo, string nativeId)
  34. {
  35. ResourceManagerImpl resourceManager = new ResourceManagerImpl(Path.Combine(ServiceManager.RootPath, "URM", "dev"));
  36. ResourceManager.Initialize(resourceManager);
  37. var dir = new VinnoDirectoryInfo(Path.Combine(ServiceManager.RootPath, "URM"));
  38. NativeProxy.UpdateSection("Path", "ShippedRoot", dir.FullName);
  39. NativeProxy.UpdateSection("Product-GeneralSpecification", "ImagePPFileName", "ImagePP_Tulip");
  40. if (ServiceManager.Os.IsWin())
  41. {
  42. ImagePP = new ImagePPNative_Win();
  43. }
  44. else
  45. {
  46. ImagePP = new ImagePPNative();
  47. }
  48. ImagePP.Initial();
  49. Logger.WriteLineInfo("Record.SetProbeApp({0},{1},{2})", familyName, typeInfo, nativeId);
  50. ImagePP.Initial(familyName, typeInfo, nativeId);
  51. // TODO Delete me
  52. var maplength = new List<int>();
  53. var result = ImagePP.GetParameter("SRColorMap:AngleMap", "SR_Map_Length", maplength, null);
  54. Logger.WriteLineInfo("ImagePP.GetParameter", result);
  55. // TODO Delete me
  56. _urmProcessAlg = new URMProcessAlg(ImagePP);
  57. _urmType.Init(URMType.Den);
  58. urmTraceDPoints = new DPoint[0];
  59. return result;
  60. }
  61. // 调节后处理参数调用此函数
  62. public void setUrmParams(RecordParams paramName, object param)
  63. {
  64. switch (paramName)
  65. {
  66. case RecordParams.URMDownSampleIndex:
  67. _urmProcessParams.DownsampleIndex = (float)param;
  68. break;
  69. case RecordParams.URMIntPowerDen:
  70. _urmProcessParams.IntPowerDen = (float)param / 10.0;
  71. break;
  72. case RecordParams.URMIntPowerDir:
  73. _urmProcessParams.IntPowerDir = (float)param / 10.0;
  74. break;
  75. case RecordParams.URMSigmaGauss:
  76. _urmProcessParams.SigmaGauss = (float)param / 2.0;
  77. break;
  78. case RecordParams.URMVessScale:
  79. _urmProcessParams.VessScale = (float)param / 5.0;
  80. break;
  81. case RecordParams.URMVelMaxScaler:
  82. _urmProcessParams.VelMaxScaler = (float)param;
  83. break;
  84. case RecordParams.URMVelMinScaler:
  85. _urmProcessParams.VelMinScaler = (float)param;
  86. break;
  87. case RecordParams.URMIterations:
  88. _urmProcessParams.iterations = (int)(float)param;
  89. break;
  90. case RecordParams.URMSigmaDen:
  91. _urmProcessParams.URMSigmaDen = (float)param;
  92. break;
  93. case RecordParams.URMSigmaStep:
  94. _urmProcessParams.URMSigmaStep = (float)param;
  95. break;
  96. case RecordParams.URMDirIterGauss:
  97. _urmProcessParams.URMDirIterGauss = (int)(float)param;
  98. break;
  99. case RecordParams.URMVideoScaler:
  100. _urmVideoParam._VideoScaler = (float)param;
  101. break;
  102. case RecordParams.URMVideoParameter:
  103. _urmVideoParam._VideoDownSampleIndex = (float)param;
  104. break;
  105. case RecordParams.URMVideoType:
  106. _urmVideoParam._VideoType = (float)param;
  107. break;
  108. case RecordParams.UrmImageType:
  109. _urmType.SetCurrent((URMType)Enum.Parse(typeof(URMType), (string)param));
  110. break;
  111. case RecordParams.UrmBlend:
  112. Mixflag = (bool)param;
  113. break;
  114. }
  115. }
  116. public void setUrmBaseParam(double res, NativeArray urmDenArray, NativeArray urmDirArray, NativeArray urmVelArray, NativeArray urmAngleArray, NativeArray urmMask, int urmSrcWidth, int urmSrcHeight, double scaleOfPixel_x, double scaleOfPixel_y, int ImgProcessVer, bool isliner)
  117. {
  118. _urmImgBaseParam.Res = res; // 参数
  119. _urmImgBaseParam.Denptr = urmDenArray.Start; // den 数组的指针
  120. _urmImgBaseParam.Dirptr = urmDirArray.Start; // dir 数组的指针
  121. _urmImgBaseParam.Velptr = urmVelArray.Start; // vel 数组的指针
  122. _urmImgBaseParam.Angleptr = urmAngleArray.Start; // angle 数组的指针
  123. _urmImgBaseParam.MaskPtr = urmMask.Start; // mask 数组的指针
  124. _urmImgBaseParam.Urmsrcwidth = urmSrcWidth; // 参数
  125. _urmImgBaseParam.Urmsrcheight = urmSrcHeight; // 参数
  126. _urmImgBaseParam.ScaleOfPixel_x = scaleOfPixel_x; // 参数
  127. _urmImgBaseParam.ScaleOfPixel_y = scaleOfPixel_y; // 参数
  128. _urmImgBaseParam.ImgProcessVer = ImgProcessVer; // urm算法版本 0 是 v2 1 是 v3
  129. _urmImgBaseParam.ProbeType = isliner ? 0 : 1;
  130. _urmProcessAlg.SetURMBaseParam(_urmImgBaseParam);
  131. }
  132. public void setUrmDrawParam(
  133. bool ZoomOn, double ZoomRoix, double ZoomRoiy, double ZoomRoiwidth, double ZoomRoiheight, int Roix, int Roiy, int Roiwidth, int Roiheight, bool LeftRight, bool UpDown, int screenWidth, int screenHeight)
  134. {
  135. // 初始化图像
  136. ScreenWidth = screenWidth;
  137. ScreenHeight = screenHeight;
  138. imagePixels = new byte[ScreenWidth * ScreenHeight * 4];
  139. for (int i = 0; i < ScreenWidth * ScreenHeight; i++)
  140. {
  141. int index = i * 4;
  142. imagePixels[index] = 0; // Blue
  143. imagePixels[index + 1] = 0; // Green
  144. imagePixels[index + 2] = 0; // Red
  145. imagePixels[index + 3] = 1; // Alpha
  146. }
  147. // 获取指针
  148. handle = GCHandle.Alloc(imagePixels, GCHandleType.Pinned);
  149. _urmImgDrawParam.ZoomOn = ZoomOn; // 是否启用 zoom
  150. _urmImgDrawParam.ZoomRoix = ZoomRoix; // zoom 后 ROI X
  151. _urmImgDrawParam.ZoomRoiy = ZoomRoiy; // zoom 后 ROI X
  152. _urmImgDrawParam.ZoomRoiwidth = ZoomRoiwidth; // zoom 后 ROI 宽度
  153. _urmImgDrawParam.ZoomRoiheight = ZoomRoiheight; // zoom 后 ROI 宽度
  154. _urmImgDrawParam.Screenimgptr = handle.AddrOfPinnedObject(); // 图像指针(最重要,用于获取图像)
  155. _urmImgDrawParam.Screenimgwidth = ScreenWidth; // 图像输出的宽度
  156. _urmImgDrawParam.Screenimgheight = ScreenHeight; // 图像输出的高度
  157. _urmImgDrawParam.Roix = Roix; // ROI x
  158. _urmImgDrawParam.Roiy = Roiy; // ROI y
  159. _urmImgDrawParam.Roiwidth = Roiwidth; // 宽度
  160. _urmImgDrawParam.Roiheight = Roiheight; // 高度
  161. _urmImgDrawParam.LeftRight = LeftRight ? 1 : 0; // 是否左右翻转
  162. _urmImgDrawParam.UpDown = UpDown ? 1 : 0; // 是否上下翻转
  163. _urmProcessAlg.SetURMDrawParam(_urmImgDrawParam);
  164. }
  165. // public WriteableBitmap getURMImage()
  166. // {
  167. // WriteableBitmap bitmap = new WriteableBitmap(ScreenWidth, ScreenHeight, 96, 96, PixelFormats.Bgra32, null);
  168. // _urmProcessAlg.SetURMParam(_urmProcessParams);
  169. // double urmMaxVal = 0; // 这个输出需要给到前端
  170. // double urmMinVal = 0; // 这个输出需要给到前端
  171. // _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  172. // Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal} {bitmap.PixelWidth}");
  173. // var urmcolormapname = getColormapname((int)_urmType.Current);
  174. // var urmcolortable = GetURMColorMap(urmcolormapname);
  175. // var Colormapptr = urmcolortable.Address; // 获取颜色映射表
  176. // if (_urmType == URMType.Angle && urmcolortable.Length != 1440)
  177. // {
  178. // Logger.WriteLineInfo("Akio:Angle ColorMapError");
  179. // return bitmap;
  180. // }
  181. // _urmProcessAlg.DrawURM((int)_urmType.Current, Colormapptr, Mixflag);
  182. // Int32Rect rect = new Int32Rect(0, 0, ScreenWidth, ScreenHeight);
  183. // bitmap.WritePixels(rect, imagePixels, ScreenWidth * 4, 0);
  184. // return bitmap;
  185. // }
  186. public void GetURMImage()
  187. {
  188. // SKBitmap bitmap = new SKBitmap(ScreenWidth, ScreenHeight);
  189. _urmProcessAlg.SetURMParam(_urmProcessParams);
  190. double urmMaxVal = 0;
  191. double urmMinVal = 0;
  192. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  193. Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  194. var urmcolormapname = getColormapname((int)_urmType.Current);
  195. var urmcolortable = GetURMColorMap(urmcolormapname);
  196. var Colormapptr = urmcolortable.Address;
  197. if (_urmType == URMType.Angle && urmcolortable.Length != 1440)
  198. {
  199. Logger.WriteLineInfo("Akio:Angle ColorMapError");
  200. // return bitmap;
  201. return;
  202. }
  203. _urmProcessAlg.DrawURM((int)_urmType.Current, Colormapptr, Mixflag);
  204. // using (var surface = SKSurface.Create(new SKImageInfo(ScreenWidth, ScreenHeight, SKColorType.Bgra8888)))
  205. // {
  206. // SKCanvas canvas = surface.Canvas;
  207. // // Draw your URM image on the canvas here
  208. // SKImage image = surface.Snapshot();
  209. // byte[] imageBytes = image.Encode().ToArray();
  210. // bitmap = SKBitmap.Decode(imageBytes);
  211. // }
  212. // return bitmap;
  213. }
  214. public void getUrmVal(ref double urmMaxVal, ref double urmMinVal)
  215. {
  216. _urmProcessAlg.SetURMParam(_urmProcessParams);
  217. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  218. Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  219. }
  220. public string getURMImageBase64(ref double urmMinVal, ref double urmMaxVal)
  221. {
  222. _urmProcessAlg.SetURMParam(_urmProcessParams);
  223. urmMinVal = 0; // 这个输出需要给到前端
  224. urmMaxVal = 0; // 这个输出需要给到前端
  225. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  226. Logger.WriteLineInfo($"CalURMImg urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  227. var urmcolormapname = getColormapname((int)_urmType.Current);
  228. var urmcolortable = GetURMColorMap(urmcolormapname);
  229. var Colormapptr = urmcolortable.Address; // 获取颜色映射表
  230. if (_urmType == URMType.Angle && urmcolortable.Length != 1440)
  231. {
  232. Logger.WriteLineInfo("Akio:Angle ColorMapError");
  233. return "";
  234. }
  235. _urmProcessAlg.DrawURM((int)_urmType.Current, Colormapptr, Mixflag);
  236. //using (SKImage image = SKImage.FromEncodedData(SKData.CreateCopy(imagePixels)))
  237. //{
  238. // SKBitmap bitMap = SKBitmap.FromImage(image);
  239. //}
  240. SKImageInfo info = new SKImageInfo(ScreenWidth, ScreenHeight, SKColorType.Bgra8888, SKAlphaType.Unpremul);
  241. // Create an SKBitmap with the given SKImageInfo
  242. SKBitmap skBitmap = new SKBitmap(info);
  243. // Copy the pixel data from the imagePixels array to the SKBitmap
  244. using (SKImage skImage = SKImage.FromPixelCopy(info, imagePixels))
  245. {
  246. skImage.ReadPixels(skBitmap.Info, skBitmap.GetPixels(), skBitmap.RowBytes, 0, 0);
  247. }
  248. using (var image = SKImage.FromBitmap(skBitmap))
  249. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  250. {
  251. byte[] imageBytes = data.ToArray();
  252. string base64String = Convert.ToBase64String(imageBytes);
  253. return base64String;
  254. }
  255. }
  256. string getColormapname(int type)
  257. {
  258. switch (type)
  259. {
  260. case 0:
  261. return "SRColorMap:ColorMap1";
  262. case 1:
  263. return "SRColorMap:ColorMap2";
  264. case 2:
  265. return "SRColorMap:ColorMap3";
  266. case 3:
  267. return "SRColorMap:AngleMap";
  268. default:
  269. return "SRColorMap:ColorMap1";
  270. }
  271. }
  272. public ColorTable GetURMColorMap(string colorMap)
  273. {
  274. var rValue = new List<int>();
  275. var gValue = new List<int>();
  276. var bValue = new List<int>();
  277. var maplength = new List<int>();
  278. var result = ImagePP.GetParameter(colorMap, "SR_Map_R", rValue, null);
  279. result = result && ImagePP.GetParameter(colorMap, "SR_Map_G", gValue, null);
  280. result = result && ImagePP.GetParameter(colorMap, "SR_Map_B", bValue, null);
  281. result = result && ImagePP.GetParameter(colorMap, "SR_Map_Length", maplength, null);
  282. ColorTable URMTable = new ColorTable(maplength[0] * sizeof(uint));
  283. if (result)
  284. {
  285. IValueAccessor<uint> intValueAccessor = URMTable;
  286. for (int i = 0; i < maplength[0]; i++)
  287. {
  288. var temp = rValue[i] << 16 | gValue[i] << 8 | bValue[i] | 0xFF000000;
  289. intValueAccessor[i] = (uint)temp;
  290. }
  291. }
  292. return URMTable;
  293. }
  294. public void CalTracePointMask(DPoint[] traceDPoints)
  295. {
  296. urmTraceDPoints = traceDPoints;
  297. var tracePointCount = urmTraceDPoints.Length;
  298. var validPoints = new List<DPoint>();
  299. for (int i = 0; i < tracePointCount; i++)
  300. {
  301. var curPiexlPoint = new DPoint(urmTraceDPoints[i].X * ScreenWidth, urmTraceDPoints[i].Y * ScreenHeight);
  302. validPoints.Add(curPiexlPoint);
  303. }
  304. _urmProcessAlg.CalTraceMaskImg(ScreenWidth, ScreenHeight, validPoints);
  305. }
  306. public void PreURMVideo(URMPoint[] urmPoints, int[] Pointsnums, ref double urmMaxVal, ref double urmMinVal)
  307. {
  308. var vediotable = GetURMColorMap("SRColorMap:ColorMap4");
  309. urmMaxVal = 0;
  310. urmMinVal = 0;
  311. _urmProcessAlg.SetURMParam(_urmProcessParams);
  312. _urmProcessAlg.CalURMImg(ref urmMaxVal, ref urmMinVal, (int)_urmType.Current);
  313. unsafe
  314. {
  315. fixed (URMPoint* AllPointsPtr = urmPoints)
  316. {
  317. fixed (int* pointlengthsptr = Pointsnums)
  318. {
  319. _urmProcessAlg.PreURMVideo(_urmVideoParam, AllPointsPtr, Pointsnums.Length, pointlengthsptr, ref urmMaxVal, ref urmMinVal);
  320. }
  321. }
  322. }
  323. videoColorTable = GetURMColorMap("SRColorMap:ColorMap4");
  324. Logger.WriteLineInfo($"PreURMVideo urmMaxVal:{urmMaxVal} urmMinVal:{urmMinVal}");
  325. }
  326. // public void getURMVideoImg(int index, WriteableBitmap dataHolder)
  327. // {
  328. // _urmProcessAlg.DrawURMVideo(index, videoColorTable.Address, Mixflag);
  329. // Int32Rect rect = new Int32Rect(0, 0, ScreenWidth, ScreenHeight);
  330. // dataHolder.WritePixels(rect, imagePixels, ScreenWidth * 4, 0);
  331. // }
  332. public string getURMVideoImg(int index)
  333. {
  334. _urmProcessAlg.DrawURMVideo(index, videoColorTable.Address, Mixflag);
  335. SKImageInfo info = new SKImageInfo(ScreenWidth, ScreenHeight, SKColorType.Bgra8888, SKAlphaType.Unpremul);
  336. // Create an SKBitmap with the given SKImageInfo
  337. SKBitmap skBitmap = new SKBitmap(info);
  338. // Copy the pixel data from the imagePixels array to the SKBitmap
  339. using (SKImage skImage = SKImage.FromPixelCopy(info, imagePixels))
  340. {
  341. skImage.ReadPixels(skBitmap.Info, skBitmap.GetPixels(), skBitmap.RowBytes, 0, 0);
  342. }
  343. using (var image = SKImage.FromBitmap(skBitmap))
  344. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  345. {
  346. byte[] imageBytes = data.ToArray();
  347. string base64String = Convert.ToBase64String(imageBytes);
  348. return base64String;
  349. }
  350. }
  351. public void CreateURMMeasuerImg(URMType urmtype, IntPtr MeasureImgStart, ref double max, ref double min)
  352. {
  353. if (urmtype == URMType.Den)
  354. {
  355. _urmProcessAlg.CalURMMeasurImg(MeasureImgStart, (int)urmtype, ref max,
  356. ref min);
  357. }
  358. else if (urmtype == URMType.Vel)
  359. {
  360. _urmProcessAlg.CalURMMeasurImg(MeasureImgStart, (int)urmtype, ref max,
  361. ref min);
  362. }
  363. }
  364. public void Dispose()
  365. {
  366. handle.Free();
  367. _urmProcessAlg.Release();
  368. if (ImagePP != null)
  369. {
  370. ImagePP.Dispose();
  371. ImagePP = null;
  372. }
  373. }
  374. }
  375. }