ImagePostProcess.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using Newtonsoft.Json;
  8. using SkiaSharp;
  9. using Vinno.DataManager.Infrastructure;
  10. using Vinno.DataManager.Utilities;
  11. using Vinno.DataTypes;
  12. using WingServerCommon.Log;
  13. namespace WingAIDiagnosisService.URMManage
  14. {
  15. public partial class URMAnalysisManager
  16. {
  17. public static List<URMProcessorClass> UrmProcessorList = new List<URMProcessorClass>();
  18. public static List<URMProcessorClass> VideoProcessorList = new List<URMProcessorClass>();
  19. private void WatchingVideoProcessor()
  20. {
  21. Task.Run(async () =>
  22. {
  23. Logger.WriteLineInfo($"URMAnalysisManager WatchingVideoProcessor start");
  24. try
  25. {
  26. while (true)
  27. {
  28. await Task.Delay(TimeSpan.FromSeconds(60));
  29. Logger.WriteLineInfo($"UrmProcessorList count1:{UrmProcessorList.Count}");
  30. for (int i = UrmProcessorList.Count - 1; i >= 0; i--)
  31. {
  32. try
  33. {
  34. var item = UrmProcessorList[i];
  35. if (item.LastActiveTime <= DateTime.UtcNow.AddMinutes(-1))
  36. {
  37. item.Processor.Dispose();
  38. DisposeArraySafely(() =>
  39. {
  40. item.DenArray.Dispose();
  41. });
  42. DisposeArraySafely(() =>
  43. {
  44. item.DirArray.Dispose();
  45. });
  46. DisposeArraySafely(() =>
  47. {
  48. item.VelArray.Dispose();
  49. });
  50. DisposeArraySafely(() =>
  51. {
  52. item.MaskArray.Dispose();
  53. });
  54. DisposeArraySafely(() =>
  55. {
  56. item.AngleArray.Dispose();
  57. });
  58. UrmProcessorList.Remove(item);
  59. }
  60. }
  61. catch (Exception ex)
  62. {
  63. Logger.WriteLineError($"URMAnalysisManager WatchingVideoProcessor UrmProcessorList error:{ex}");
  64. }
  65. }
  66. Logger.WriteLineInfo($"UrmProcessorList count2:{UrmProcessorList.Count}");
  67. Logger.WriteLineInfo($"VideoProcessorList count1:{VideoProcessorList.Count}");
  68. for (int i = VideoProcessorList.Count - 1; i >= 0; i--)
  69. {
  70. try
  71. {
  72. var item = VideoProcessorList[i];
  73. if (item.LastActiveTime <= DateTime.UtcNow.AddMinutes(-1))
  74. {
  75. item.Processor.Dispose();
  76. DisposeArraySafely(() =>
  77. {
  78. item.DenArray.Dispose();
  79. });
  80. DisposeArraySafely(() =>
  81. {
  82. item.DirArray.Dispose();
  83. });
  84. DisposeArraySafely(() =>
  85. {
  86. item.VelArray.Dispose();
  87. });
  88. DisposeArraySafely(() =>
  89. {
  90. item.MaskArray.Dispose();
  91. });
  92. DisposeArraySafely(() =>
  93. {
  94. item.AngleArray.Dispose();
  95. });
  96. VideoProcessorList.Remove(item);
  97. }
  98. }
  99. catch (Exception ex)
  100. {
  101. Logger.WriteLineError($"URMAnalysisManager WatchingVideoProcessor VideoProcessorList error:{ex}");
  102. }
  103. }
  104. Logger.WriteLineInfo($"VideoProcessorList count2:{VideoProcessorList.Count}");
  105. }
  106. }
  107. catch (Exception e)
  108. {
  109. Logger.WriteLineError($"URMAnalysisManager WatchingVideoProcessor error:{e}");
  110. }
  111. });
  112. }
  113. /// <summary>
  114. /// URM后处理 Draw Image
  115. /// </summary>
  116. /// <param name="request"></param>
  117. public async Task<WingInterfaceLibrary.Request.RemedicalAISelected.URMProcessResult> DoUrmProcess(UrmProcessRequest request)
  118. {
  119. var result = new WingInterfaceLibrary.Request.RemedicalAISelected.URMProcessResult();
  120. Logger.WriteLineInfo($"AIDiagnosis DoUrmProcess InitURMProcessor,GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  121. await InitURMProcessor(request);
  122. try
  123. {
  124. var processorClass = UrmProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
  125. processorClass.LastActiveTime = DateTime.UtcNow;
  126. var processor = processorClass.Processor;
  127. using (await _lockManager.Acquire(request.GUID))
  128. {
  129. await Task.Run(() =>
  130. {
  131. double urmMinVal = 0;
  132. double urmMaxVal = 0;
  133. //赋值
  134. processor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
  135. processor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
  136. processor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
  137. processor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
  138. processor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
  139. processor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
  140. processor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
  141. processor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
  142. processor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
  143. processor.setUrmParams(RecordParams.URMIterations, request.Iterations);
  144. processor.setUrmBaseParam(request.Res, processorClass.DenArray, processorClass.DirArray, processorClass.VelArray, processorClass.AngleArray, processorClass.MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer);
  145. processor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
  146. processor.CalTracePointMask(request.UrmTraceDPoints);
  147. WingServerCommon.Log.Logger.WriteLineInfo($"getURMImageBase64,GUID:{request.GUID},token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  148. result.Base64String = processor.getURMImageBase64(true, ref urmMinVal, ref urmMaxVal);
  149. result.UrmMaxVal = urmMaxVal;
  150. result.UrmMinVal = urmMinVal;
  151. processorClass.UrmMinVal = urmMinVal;
  152. processorClass.UrmMaxVal = urmMaxVal;
  153. processorClass.HasDrawed = true;
  154. Logger.WriteLineInfo("AIDiagnosis DoUrmProcess end");
  155. });
  156. }
  157. }
  158. catch (Exception ex)
  159. {
  160. Logger.WriteLineWarn($"AIService URMAnalysisManager DoUrmProcess error, ex:{ex}");
  161. }
  162. return result;
  163. }
  164. /// <summary>
  165. /// URM获取colorbar
  166. /// </summary>
  167. /// <param name="request"></param>
  168. public async Task<string> CreateUrmColorbarImage(UrmProcessRequest request)
  169. {
  170. var imgBase64 = "";
  171. await InitURMProcessor(request);
  172. try
  173. {
  174. var processorClass = UrmProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
  175. processorClass.LastActiveTime = DateTime.UtcNow;
  176. var processor = processorClass.Processor;
  177. try
  178. {
  179. using (await _lockManager.Acquire(request.GUID))
  180. {
  181. await Task.Run(() =>
  182. {
  183. //赋值
  184. processor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
  185. processor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
  186. processor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
  187. processor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
  188. processor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
  189. processor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
  190. processor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
  191. processor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
  192. processor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
  193. processor.setUrmParams(RecordParams.URMIterations, request.Iterations);
  194. processor.setUrmBaseParam(request.Res, processorClass.DenArray, processorClass.DirArray, processorClass.VelArray, processorClass.AngleArray, processorClass.MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer);
  195. processor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
  196. //colorbar
  197. WingServerCommon.Log.Logger.WriteLineInfo($"CreateUrmColorbarImage,GUID:{request.GUID},token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  198. imgBase64 = processor.CreateUrmColorbarImage();
  199. });
  200. }
  201. }
  202. catch (Exception ex)
  203. {
  204. WingServerCommon.Log.Logger.WriteLineError($"_urmProcessAlg.CreateUrmColorbarImage error :{ex}");
  205. }
  206. }
  207. catch (Exception ex)
  208. {
  209. Logger.WriteLineWarn($"AIService URMAnalysisManager DoUrmProcess error, ex:{ex}");
  210. }
  211. return imgBase64;
  212. }
  213. /// <summary>
  214. /// URM后处理 Measure Test
  215. /// </summary>
  216. /// <param name="request"></param>
  217. /// <returns></returns>
  218. public async Task<WingInterfaceLibrary.Request.RemedicalAISelected.URMMeasureProcessResult> MeasureProcess(string remedicalCode, UrmMeasureProcessRequest request)
  219. {
  220. WingInterfaceLibrary.Request.RemedicalAISelected.URMMeasureProcessResult outResult = new WingInterfaceLibrary.Request.RemedicalAISelected.URMMeasureProcessResult();
  221. Logger.WriteLineInfo($"AIDiagnosis MeasureProcess,UrmMeasureType:{request.UrmMeasureType},GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  222. await InitURMProcessor(request);
  223. try
  224. {
  225. var processor = UrmProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
  226. processor.LastActiveTime = DateTime.UtcNow;
  227. using (await _lockManager.Acquire(request.GUID))
  228. {
  229. var urmMinVal = 0;
  230. var urmMaxVal = 0;
  231. await Task.Run(() =>
  232. {
  233. // processor.Processor.getUrmVal(ref urmMinVal, ref urmMaxVal);
  234. int samplingPoints = 256; // 采样点数量 (cmlength 不传的话,默认是 256)
  235. if (request.CMlength != null)
  236. {
  237. samplingPoints = (int)(request.CMlength * 1000);
  238. }
  239. URMMeasure urmMeasure = new URMMeasure(processor.Processor);
  240. var param = new URMMeasureDataInput();
  241. param.SrcDPoints = request.SrcDPoints;
  242. param.phywidth = request.Phywidth;
  243. if (request.ROIType != 0)
  244. {
  245. param.RoiType = request.ROIType;
  246. }
  247. param.SamplingPoints = samplingPoints;
  248. param.urmMeasureType = request.UrmMeasureType;
  249. param.ShellWidth = request.ShellWidth;
  250. WingServerCommon.Log.Logger.WriteLineInfo($"CalURMData,GUID:{request.GUID},token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  251. var result = urmMeasure.CalURMData(param, request.ScreenWidth, request.ScreenHeight, urmMaxVal, urmMinVal);
  252. // 获取灌注图 example
  253. IntPtr imgPtr = result.PerfusionImgData.Start;
  254. var perfusionImgBase64 = ConvertImageToBase64(remedicalCode, imgPtr, result.PerfusionPiexlRect.Width, result.PerfusionPiexlRect.Height);
  255. outResult = JsonConvert.DeserializeObject<WingInterfaceLibrary.Request.RemedicalAISelected.URMMeasureProcessResult>(JsonConvert.SerializeObject(result));
  256. outResult.PerfusionImgBase64 = perfusionImgBase64;
  257. outResult.UrmMaxVal = urmMaxVal;
  258. outResult.UrmMinVal = urmMinVal;
  259. });
  260. }
  261. return outResult;
  262. }
  263. catch (Exception ex)
  264. {
  265. Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisManager MeasureProcess error, ex:{ex}");
  266. outResult.PerfusionImgBase64 = string.Empty;
  267. return null;
  268. }
  269. }
  270. public string ConvertImageToBase64(string remedicalCode, IntPtr imgPtr, int W, int H)
  271. {
  272. try
  273. {
  274. // 创建SKImageInfo以描述图像信息
  275. SKImageInfo imageInfo = new SKImageInfo(W, H, SKColorType.Bgra8888, SKAlphaType.Premul);
  276. // 创建SKBitmap并复制图像数据
  277. using (SKBitmap bitmap = new SKBitmap())
  278. {
  279. bitmap.InstallPixels(imageInfo, imgPtr, W * 4, (addr, ctx) => { }, IntPtr.Zero);
  280. // 将SKBitmap编码为PNG格式的数据
  281. using (MemoryStream memoryStream = new MemoryStream())
  282. {
  283. using (SKImage skImage = SKImage.FromBitmap(bitmap))
  284. {
  285. skImage.Encode(SKEncodedImageFormat.Png, 100).SaveTo(memoryStream);
  286. byte[] imageBytes = memoryStream.ToArray();
  287. return Convert.ToBase64String(imageBytes);
  288. }
  289. }
  290. }
  291. }
  292. catch (Exception ex)
  293. {
  294. Logger.WriteLineWarn($"AIDiagnosis URMAnalysisManager ConvertImageToBase64 failed, remedicalCode:{remedicalCode}, W:{W}, H:{H}. ex:{ex}");
  295. return string.Empty;
  296. }
  297. }
  298. /// <summary>
  299. /// URM后处理 Draw One frame
  300. /// </summary>
  301. /// <param name="request"></param>
  302. /// <returns></returns>
  303. public string DoUrmVideoProcess(DoUrmVideoProcessRequest request, ref double urmMinVal, ref double urmMaxVal)
  304. {
  305. var imgBase64 = "";
  306. urmMinVal = 0;
  307. urmMaxVal = 0;
  308. InitVideoProcessor(request);
  309. try
  310. {
  311. var videoProcessor = VideoProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
  312. videoProcessor.LastActiveTime = DateTime.UtcNow;
  313. urmMinVal = videoProcessor.UrmMinVal;
  314. urmMaxVal = videoProcessor.UrmMaxVal;
  315. imgBase64 = videoProcessor.Processor.getURMVideoImg(request.VideoFrame);
  316. }
  317. catch (Exception ex)
  318. {
  319. Logger.WriteLineWarn($"AIService URMAnalysisManager DoUrmVideoProcess error, ex:{ex}");
  320. }
  321. return imgBase64;
  322. }
  323. public URMProcessorClass InitVideoProcessor(DoUrmVideoProcessRequest request)
  324. {
  325. URMProcessorClass processorClass = null;
  326. try
  327. {
  328. processorClass = VideoProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
  329. if (processorClass == null)
  330. {
  331. double urmMaxVal = 0;
  332. double urmMinVal = 0;
  333. NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
  334. NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
  335. NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
  336. NativeArray AngleArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.AngleDataPath, request.Urmsrcwidth * request.Urmsrcheight); // 360图的数据
  337. NativeArray MaskArray = ResultDataIOHelper.ReadByteArrayFromFile(request.MaskDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Mask
  338. URMPoint[] URMPoints = ResultDataIOHelper.ReadURMPointsFromFile(request.PointsDataPath);
  339. int[] URMPointNums = ResultDataIOHelper.ReadURMPointNumsFromFile(request.PointNumsDataPath);
  340. // 参数设置
  341. var videoProcessor = new URMProcess();
  342. bool initSuccess = videoProcessor.init(request.FamilyName, request.TypeInfo, request.NativeId);
  343. // 设置视频配置
  344. videoProcessor.setUrmParams(RecordParams.URMVideoScaler, request.URMVideoScaler);
  345. videoProcessor.setUrmParams(RecordParams.URMVideoParameter, request.URMVideoParameter);
  346. videoProcessor.setUrmParams(RecordParams.URMVideoType, request.URMVideoType);
  347. // 设置图像配置
  348. videoProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
  349. videoProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
  350. videoProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
  351. videoProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
  352. videoProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
  353. videoProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
  354. videoProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
  355. videoProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
  356. videoProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
  357. videoProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
  358. videoProcessor.setUrmBaseParam(request.Res, DenArray, DirArray, VelArray, AngleArray, MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer);
  359. videoProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight
  360. );
  361. videoProcessor.PreURMVideo(URMPoints, URMPointNums, ref urmMaxVal, ref urmMinVal);
  362. videoProcessor.CalTracePointMask(request.UrmTraceDPoints);
  363. processorClass = new URMProcessorClass { GUID = request.GUID, Processor = videoProcessor, LastActiveTime = DateTime.UtcNow, UrmMinVal = urmMinVal, UrmMaxVal = urmMaxVal };
  364. VideoProcessorList.Add(processorClass);
  365. }
  366. }
  367. catch (Exception ex)
  368. {
  369. Logger.WriteLineWarn($"AIService URMAnalysisManager InitVideoProcessor error, ex:{ex}");
  370. }
  371. return processorClass;
  372. }
  373. public async Task<URMProcessorClass> InitURMProcessor(UrmProcessRequest request)
  374. {
  375. Logger.WriteLineInfo($"AIDiagnosis DoUrmProcess InitURMProcessor start,GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  376. URMProcessorClass processorClass = null;
  377. try
  378. {
  379. using (await _lockManager.Acquire(request.GUID))
  380. {
  381. processorClass = UrmProcessorList.FirstOrDefault(x => x.GUID == request.GUID);
  382. if (processorClass == null)
  383. {
  384. Logger.WriteLineInfo($"AIDiagnosis DoUrmProcess InitURMProcessor ReadFile,GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  385. NativeArray DenArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DenDataPath, request.Urmsrcwidth * request.Urmsrcheight); //Den的分析后数据
  386. NativeArray DirArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.DirDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Dir的分析后数据
  387. NativeArray VelArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.VelDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Vel的分析后数据
  388. NativeArray AngleArray = ResultDataIOHelper.ReadDoubleArrayFromFile(request.AngleDataPath, request.Urmsrcwidth * request.Urmsrcheight); // 360图的数据
  389. NativeArray MaskArray = ResultDataIOHelper.ReadByteArrayFromFile(request.MaskDataPath, request.Urmsrcwidth * request.Urmsrcheight); // Mask
  390. Logger.WriteLineInfo($"AIDiagnosis DoUrmProcess InitURMProcessor init,GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}"); // 参数设置
  391. var urmProcessor = new URMProcess();
  392. urmProcessor.init(request.FamilyName, request.TypeInfo, request.NativeId);
  393. //测量
  394. if (request.ProcessType == 3)
  395. {
  396. //赋值
  397. urmProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
  398. urmProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
  399. urmProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
  400. urmProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
  401. urmProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
  402. urmProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
  403. urmProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
  404. urmProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
  405. urmProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
  406. urmProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
  407. urmProcessor.setUrmBaseParam(request.Res, DenArray, DirArray, VelArray, AngleArray, MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer);
  408. urmProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
  409. urmProcessor.CalTracePointMask(request.UrmTraceDPoints);
  410. urmProcessor.GetURMImage();
  411. }
  412. Logger.WriteLineInfo($"AIDiagnosis DoUrmProcess InitURMProcessor setUrmParams,GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  413. processorClass = new URMProcessorClass
  414. {
  415. GUID = request.GUID,
  416. Processor = urmProcessor,
  417. LastActiveTime = DateTime.UtcNow,
  418. DenArray = DenArray,
  419. DirArray = DirArray,
  420. VelArray = VelArray,
  421. AngleArray = AngleArray,
  422. MaskArray = MaskArray
  423. };
  424. UrmProcessorList.Add(processorClass);
  425. Logger.WriteLineInfo($"AIDiagnosis DoUrmProcess InitURMProcessor end,GUID:{request.GUID},Token:{request.Token},RemedicalCode:{request.RemedicalCode}");
  426. }
  427. }
  428. }
  429. catch (Exception ex)
  430. {
  431. Logger.WriteLineWarn($"AIService URMAnalysisManager InitURMProcessor error, ex:{ex}");
  432. }
  433. return processorClass;
  434. }
  435. private URMProcess SetUrmProcessorByParams(URMProcessorClass processorClass, UrmProcessRequest request)
  436. {
  437. processorClass.LastActiveTime = DateTime.UtcNow;
  438. var UrmProcessor = processorClass.Processor;
  439. UrmProcessor.setUrmParams(RecordParams.UrmImageType, request.UrmImageType);
  440. UrmProcessor.setUrmParams(RecordParams.UrmBlend, request.UrmBlend);
  441. UrmProcessor.setUrmParams(RecordParams.URMDownSampleIndex, request.DownsampleIndex);
  442. UrmProcessor.setUrmParams(RecordParams.URMIntPowerDen, request.IntPowerDen);
  443. UrmProcessor.setUrmParams(RecordParams.URMIntPowerDir, request.IntPowerDir);
  444. UrmProcessor.setUrmParams(RecordParams.URMSigmaGauss, request.SigmaGauss);
  445. UrmProcessor.setUrmParams(RecordParams.URMVessScale, request.VessScale);
  446. UrmProcessor.setUrmParams(RecordParams.URMVelMaxScaler, request.VelMaxScaler);
  447. UrmProcessor.setUrmParams(RecordParams.URMVelMinScaler, request.VelMinScaler);
  448. UrmProcessor.setUrmParams(RecordParams.URMIterations, request.Iterations);
  449. UrmProcessor.setUrmBaseParam(request.Res, processorClass.DenArray, processorClass.DirArray, processorClass.VelArray, processorClass.AngleArray, processorClass.MaskArray, request.Urmsrcwidth, request.Urmsrcheight, request.ScaleOfPixel_x, request.ScaleOfPixel_y, request.ImgProcessVer);
  450. UrmProcessor.setUrmDrawParam(request.ZoomOn, request.ZoomRoix, request.ZoomRoiy, request.ZoomRoiwidth, request.ZoomRoiheight, request.Roix, request.Roiy, request.Roiwidth, request.Roiheight, request.LeftRight, request.UpDown, request.ScreenWidth, request.ScreenHeight);
  451. return UrmProcessor;
  452. }
  453. public static void DisposeArraySafely(Action disposeAction)
  454. {
  455. try
  456. {
  457. disposeAction.Invoke();
  458. }
  459. catch (Exception ex)
  460. {
  461. Logger.WriteLineWarn("An error occurred during array disposal: " + ex.Message);
  462. }
  463. }
  464. }
  465. }