URMAnalysisManager.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. using System;
  2. using System.IO;
  3. using SixLabors.ImageSharp;
  4. using SixLabors.ImageSharp.Processing;
  5. using Vinno.DataTypes;
  6. using Vinno.Infrastructure;
  7. using WingInterfaceLibrary.Request.RemedicalAISelected;
  8. namespace WingAIDiagnosisService.URMManage
  9. {
  10. public class URMAnalysisManager
  11. {
  12. public URMAnalysisV2Result DoURMAnalysis(string[] args)
  13. {
  14. AppendEnvironmentPath();
  15. var arg2Params = args[3].Split(";");
  16. var familyName = "Linear";
  17. var typeInfo = "Linear_U5-15LE";
  18. var nativeId = "Breast";
  19. var VecLens = 568;
  20. var Mlas = 128;
  21. var FramesGot = 2200;
  22. var CenterFrequencyMhz = 4.7;
  23. var SupersonicSpeed = 1540;
  24. var FrequencyMin = 6.5;
  25. var FrameRateDisplay = 101.9;
  26. var Depth = 0;
  27. var X0 = 0;
  28. var Z0 = 0;
  29. var ProbeType = "1";
  30. var ScaleOfPixel_x = 0.214925914347303;
  31. var ScaleOfPixel_y = 0.61038961038961;
  32. var section = "URMAnalysisParam:Level4";
  33. var MOCOYN = "0";
  34. var MidProc_DeciFactor = 1;
  35. var VectorStartForMid = 11;
  36. var isliner = false;
  37. // 前端调用时传入
  38. var startX = 47;
  39. var startY = 14;
  40. var width = 74;
  41. var height = 492;
  42. int? CustomizedStartFrame = null;
  43. int? CustomizedEndFrame = null;
  44. var UrmDatapath = arg2Params[0];
  45. // var familyName = arg2Params[1];
  46. // var typeInfo = arg2Params[2];
  47. // var nativeId = arg2Params[3];
  48. // var VecLens = ConvertToInt(arg2Params[4]);
  49. // var Mlas = ConvertToInt(arg2Params[5]);
  50. // var FramesGot = ConvertToInt(arg2Params[6]);
  51. // var CenterFrequencyMhz = ConvertToDouble(arg2Params[7]);
  52. // var SupersonicSpeed = ConvertToInt(arg2Params[8]);
  53. // var FrequencyMin = ConvertToDouble(arg2Params[9]);
  54. // var FrameRateDisplay = ConvertToDouble(arg2Params[10]);
  55. // var Depth = ConvertToInt(arg2Params[11]);
  56. // var X0 = ConvertToInt(arg2Params[12]);
  57. // var Z0 = ConvertToInt(arg2Params[13]);
  58. // var ProbeType = arg2Params[14];
  59. // var ScaleOfPixel_x = ConvertToDouble(arg2Params[15]);
  60. // var ScaleOfPixel_y = ConvertToDouble(arg2Params[16]);
  61. // var section = arg2Params[17];
  62. // var MOCOYN = arg2Params[18];
  63. // var MidProc_DeciFactor = ConvertToInt(arg2Params[19]);
  64. // var VectorStartForMid = ConvertToInt(arg2Params[20]);
  65. // var isliner = arg2Params[21]?.ToLower() == "true";
  66. // // 前端调用时传入
  67. // var startX = ConvertToInt(arg2Params[22]);
  68. // var startY = ConvertToInt(arg2Params[23]);
  69. // var width = ConvertToInt(arg2Params[24]);
  70. // var height = ConvertToInt(arg2Params[25]);
  71. // int? CustomizedStartFrame = ConvertToIntCanNull(arg2Params[26]);
  72. // int? CustomizedEndFrame = ConvertToIntCanNull(arg2Params[27]);
  73. var roiXPercent = ConvertToDouble(arg2Params[28]);
  74. var roiYPercent = ConvertToDouble(arg2Params[29]);
  75. var roiWPercent = ConvertToDouble(arg2Params[30]);
  76. var roiHPercent = ConvertToDouble(arg2Params[31]);
  77. // 开始执行分析
  78. URMFileIO urmFileIO = new URMFileIO(familyName: familyName, typeInfo: typeInfo, nativeId: nativeId);
  79. urmFileIO.UpdateParamJson(UrmDatapath, VecLens, Mlas, FramesGot, CenterFrequencyMhz, SupersonicSpeed, FrequencyMin, FrameRateDisplay, Depth, X0, Z0, ProbeType, ScaleOfPixel_x, ScaleOfPixel_y, section, MOCOYN, MidProc_DeciFactor, VectorStartForMid, startX, startY, width, height, CustomizedStartFrame, CustomizedEndFrame, out string urmParams);
  80. var modeRecord = new URMAnalysisModeRecord();
  81. try
  82. {
  83. var outputFolder = args[1];
  84. if (!Directory.Exists(outputFolder))
  85. {
  86. Directory.CreateDirectory(outputFolder);
  87. }
  88. bool success = URMAnalysisProcess.GetInstance().URMAnalysis(urmParams, modeRecord);
  89. // 读取输出
  90. var SrcWidth = modeRecord.URMSrcWidth;
  91. var SrcHeight = modeRecord.URMSrcHeight;
  92. var denPath = Path.Combine(outputFolder, "srcDenArray.bin");
  93. var dirPath = Path.Combine(outputFolder, "srcDirArray.bin");
  94. var velPath = Path.Combine(outputFolder, "srcVelArray.bin");
  95. var angelPath = Path.Combine(outputFolder, "srcAngleArray.bin");
  96. var maskPath = Path.Combine(outputFolder, "srcMaskArray.bin");
  97. var pointsPath = Path.Combine(outputFolder, "URMPoints.bin");
  98. var pointNumsPath = Path.Combine(outputFolder, "URMPointNums.bin");
  99. ResultDataIOHelper.WriteArrayToFile(denPath, modeRecord.URMDenArray, SrcWidth * SrcHeight);
  100. ResultDataIOHelper.WriteArrayToFile(dirPath, modeRecord.URMDirArray, SrcWidth * SrcHeight);
  101. ResultDataIOHelper.WriteArrayToFile(velPath, modeRecord.URMVelArray, SrcWidth * SrcHeight);
  102. ResultDataIOHelper.WriteArrayToFile(angelPath, modeRecord.URMAngleImgArray, SrcWidth * SrcHeight);
  103. ResultDataIOHelper.WriteByteArrayToFile(maskPath, modeRecord.URMMask, SrcWidth * SrcHeight);
  104. ResultDataIOHelper.WriteURMPointsToFile(pointsPath, modeRecord.URMPoints);
  105. ResultDataIOHelper.WriteURMPointNumsToFile(pointNumsPath, modeRecord.URMPointNums);
  106. var coverFile = args[2];
  107. int coverImageWidth = 0;
  108. int coverImageHeight = 0;
  109. using (var image = Image.Load(coverFile))
  110. {
  111. coverImageWidth = image.Width;
  112. coverImageHeight = image.Height;
  113. }
  114. var urmProcess = new ImagePostProcess();
  115. var imgBase64 = urmProcess.DoUrmProcess(new UrmProcessRequest
  116. {
  117. FamilyName = familyName,
  118. TypeInfo = typeInfo,
  119. NativeId = nativeId,
  120. Isliner = isliner,
  121. ScaleOfPixel_x = ScaleOfPixel_x,
  122. ScaleOfPixel_y = ScaleOfPixel_y,
  123. Urmsrcwidth = SrcWidth,
  124. Urmsrcheight = SrcHeight,
  125. DenDataPath = denPath,
  126. DirDataPath = dirPath,
  127. VelDataPath = velPath,
  128. AngleDataPath = angelPath,
  129. MaskDataPath = maskPath,
  130. Res = modeRecord.URMRes,
  131. UrmImageType = "0",
  132. UrmBlend = true,
  133. DownsampleIndex = 3,
  134. IntPowerDen = 4,
  135. IntPowerDir = 4,
  136. SigmaGauss = 2.4f,
  137. VessScale = 1,
  138. VelMaxScaler = 1,
  139. VelMinScaler = 0,
  140. Iterations = 1,
  141. ImgProcessVer = 1,
  142. ZoomOn = false,
  143. ZoomRoix = 0,
  144. ZoomRoiy = 0,
  145. ZoomRoiwidth = 1,
  146. ZoomRoiheight = 1,
  147. LeftRight = false,
  148. UpDown = false,
  149. UrmTraceDPoints = new DPoint[] { },
  150. Roix = (int)(coverImageWidth * roiXPercent),
  151. Roiy = (int)(coverImageHeight * roiYPercent),
  152. Roiwidth = (int)(coverImageWidth * roiWPercent),
  153. Roiheight = (int)(coverImageHeight * roiHPercent),
  154. ScreenWidth = coverImageWidth,
  155. ScreenHeight = coverImageHeight,
  156. });
  157. var mergeFilePath = coverFile;
  158. if (!string.IsNullOrWhiteSpace(imgBase64))
  159. {
  160. mergeFilePath = Path.Combine(outputFolder, $"{Guid.NewGuid():N}.png");
  161. using (var image1 = Image.Load(coverFile))
  162. {
  163. // 将base64字符串转换为字节数组
  164. byte[] bytes = Convert.FromBase64String(imgBase64);
  165. // 将字节数组转换为Image对象
  166. using (var image2 = Image.Load(bytes))
  167. {
  168. // 将第二张图片画在第一张图片上
  169. image1.Mutate(ctx => ctx.DrawImage(image2, new Point(0, 0), 1f));
  170. // 保存合成后的图片
  171. image1.Save(mergeFilePath);
  172. }
  173. }
  174. }
  175. var outMsg = new URMAnalysisV2Result
  176. {
  177. URMSrcWidth = modeRecord.URMSrcWidth,
  178. URMSrcHeight = modeRecord.URMSrcHeight,
  179. URMRes = modeRecord.URMRes,
  180. ConverImageUrl = mergeFilePath,
  181. };
  182. return outMsg;
  183. }
  184. catch (Exception ex)
  185. {
  186. }
  187. return null;
  188. }
  189. private void AppendEnvironmentPath()
  190. {
  191. var urmFolder = Path.Combine(ServiceManager.RootPath, "URM");
  192. var privatePath = @$"C:\VinnoApp_Lab\Depends;C:\VinnoApp_Lab\ipp_2018;AIMeasure;AI;Depends;DicomMpeg;Syncfusion;RemoteDiagnosis;vCloud;Test;VFetus;{urmFolder}";
  193. bool enforcePentiumMode = false;
  194. string workPathPerCPU = string.Empty;
  195. string workPathForGPU = string.Empty;
  196. workPathPerCPU = Path.Combine(ServiceManager.RootPath, "NON_PENTIUM");
  197. privatePath = privatePath + ";" + workPathPerCPU + ";";
  198. string gpuName = string.Empty;
  199. workPathForGPU = Path.Combine(ServiceManager.RootPath, "NVIDIA");
  200. if (!string.IsNullOrEmpty(workPathForGPU))
  201. {
  202. privatePath = privatePath + workPathForGPU + ";";
  203. }
  204. if (!string.IsNullOrEmpty(privatePath))
  205. {
  206. string path = Environment.GetEnvironmentVariable("PATH");
  207. string newPath = string.Empty;
  208. if (path != null)
  209. {
  210. string upperPath = path.ToUpper();
  211. var subPathes = privatePath.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
  212. foreach (var subPath in subPathes)
  213. {
  214. VinnoDirectoryInfo dir = null;
  215. if (Path.IsPathRooted(subPath))
  216. {
  217. dir = new VinnoDirectoryInfo(subPath);
  218. }
  219. else
  220. {
  221. dir = new VinnoDirectoryInfo(Path.Combine(ServiceManager.RootPath, subPath));
  222. }
  223. if (dir.Exists)
  224. {
  225. var fullName = dir.FullName;
  226. if (!upperPath.Contains(fullName.ToUpper()))
  227. {
  228. newPath += ";" + fullName;
  229. }
  230. }
  231. }
  232. if (!string.IsNullOrEmpty(newPath))
  233. {
  234. Environment.SetEnvironmentVariable("PATH", newPath + ";" + path, EnvironmentVariableTarget.Process);
  235. }
  236. }
  237. }
  238. }
  239. private int ConvertToInt(string value)
  240. {
  241. if (string.IsNullOrWhiteSpace(value))
  242. {
  243. return 0;
  244. }
  245. if (int.TryParse(value, out int x))
  246. {
  247. return x;
  248. }
  249. return 0;
  250. }
  251. private int? ConvertToIntCanNull(string value)
  252. {
  253. if (string.IsNullOrWhiteSpace(value))
  254. {
  255. return null;
  256. }
  257. if (int.TryParse(value, out int x))
  258. {
  259. return x;
  260. }
  261. return 0;
  262. }
  263. private double ConvertToDouble(string value)
  264. {
  265. if (string.IsNullOrWhiteSpace(value))
  266. {
  267. return 0;
  268. }
  269. if (double.TryParse(value, out double x))
  270. {
  271. return x;
  272. }
  273. return 0;
  274. }
  275. }
  276. }