URMAnalysisProcess.cs 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using MathWorks.MATLAB.NET.Arrays;
  5. using Vinno.DataManager.Utilities;
  6. using Vinno.DataTypes;
  7. using Vinno.Infrastructure;
  8. using Vinno.Models.Base.ParamMetas;
  9. using SR_Main;
  10. using SkiaSharp;
  11. using System.IO;
  12. using URMPakcage.URM;
  13. namespace URMPackage.URM.URMAnalysis
  14. {
  15. [StructLayout(LayoutKind.Sequential)]
  16. public class URMAVIParam
  17. {
  18. public double Res { get; set; }
  19. public double ScaleOfPixel_x { get; set; }
  20. public double ScaleOfPixel_y { get; set; }
  21. public double IntPowerDir { get; set; }
  22. public double DownsampleIndexVideo { get; set; }
  23. public IntPtr MaskArray { get; set; }
  24. public URMAVIParam()
  25. {
  26. Res = 10;
  27. ScaleOfPixel_x = 1.0;
  28. ScaleOfPixel_y = 1.0;
  29. IntPowerDir = 0.25;
  30. DownsampleIndexVideo = 2;
  31. MaskArray = IntPtr.Zero;
  32. }
  33. };
  34. public struct POINT
  35. {
  36. public int X;
  37. public int Y;
  38. public POINT(int x, int y)
  39. {
  40. X = x;
  41. Y = y;
  42. }
  43. public override string ToString()
  44. {
  45. return ("X:" + X + ", Y:" + Y);
  46. }
  47. }
  48. public class URMAnalysisProcess
  49. {
  50. [DllImport("ImageProcessAlgWrapLibV2.dll")]
  51. private static extern IntPtr PIA_CreateURMAnalysisDataProcess();
  52. [DllImport("ImageProcessAlgWrapLibV2.dll")]
  53. private static extern void PIA_URMAnalysisDataProcess_Release(IntPtr handPtr);
  54. [DllImport("ImageProcessAlgWrapLibV2.dll")]
  55. private static extern unsafe bool PIA_URMGetLastResultFromPackets(IntPtr handPtr, IntPtr srcMats, IntPtr srcMatdirs, IntPtr srcMatvels, int packets, int srcwidth, int srcheight, IntPtr dstMat, IntPtr dstMatdir, IntPtr dstMatvel);
  56. [DllImport("ImageProcessAlgWrapLibV2.dll")]
  57. private static extern void PIA_TransposeImg(IntPtr handPtr, IntPtr srcdst, int beams, int samples);
  58. [DllImport("user32.dll", SetLastError = true)]
  59. private static extern bool GetCursorPos(out POINT pt);
  60. private IntPtr _handle;
  61. private IntPtr _handle_v1;
  62. //private ModeRecord _urmModeRecord;
  63. private bool initSrMain;
  64. private int _urmwidth;
  65. private int _urmheight;
  66. private double lambda;
  67. private int aviFrames;
  68. private VinnoSR urmAnalysis;
  69. //private IMode _mode;
  70. private URMAVIParam _urmaviParam;
  71. private double temp_ScaleOfPixel_x;
  72. private double temp_ScaleOfPixel_y;
  73. public double ScreenWidth = 980;
  74. public double ScreenHeight = 650;
  75. public List<List<SrPoint>> analysisDataPointNumListPoints;
  76. public int[] analysisDataPointNumList;
  77. //public URMAnalysisProcess(IMode mode, ModeRecord modeRecord)
  78. public URMAnalysisProcess()
  79. {
  80. _handle = PIA_CreateURMAnalysisDataProcess();
  81. _handle_v1 = URMAnalysisProcessV1.PIA_CreateSrProcess();
  82. urmAnalysis = new VinnoSR();
  83. //_urmModeRecord = modeRecord;
  84. //_mode = mode;
  85. _urmaviParam = new URMAVIParam();
  86. }
  87. public void Release()
  88. {
  89. PIA_URMAnalysisDataProcess_Release(_handle);
  90. }
  91. private NativeArray srcArray;
  92. private NativeArray srcArraydir;
  93. private NativeArray srcArrayvel;
  94. private int SrcWidth;
  95. private int SrcHeight;
  96. private Dictionary<string, SRColorBarParam> srColorBarParams;
  97. private NativeArray Densitycolormap;
  98. private int Densitycolormaplength;
  99. private NativeArray Directioncolormap;
  100. private int Directioncolormaplength;
  101. private NativeArray Velcolormap;
  102. private int Velcolormaplength;
  103. private NativeArray Avicolormap;
  104. private int AvicolormapLength;
  105. public bool URMAnalysis(string urmFold, string outputFolder, Action<string, string> funWriteLog)
  106. {
  107. if (urmAnalysis == null)
  108. {
  109. Logger.WriteLineError("SuperResolution error: SrMain, _srMain is null");
  110. return false;
  111. }
  112. funWriteLog.Invoke(outputFolder, "LoadColorBarParams start");
  113. LoadColorBarParams();
  114. funWriteLog.Invoke(outputFolder, "LoadColorBarParams end");
  115. int urmStabilizer = 0;
  116. MWArray folder = urmFold;
  117. //if (ResourceManager.GetValue("Product-GeneralSpecification", "UrmParamLogOut", false))
  118. //{
  119. // Logger.ForceWriteLine("Matlab " + folder);
  120. //}
  121. //urmStabilizer = (int)_mode.Parameters.GetItem<FloatParameter>(RecordParams.URMStabilizer).Value;
  122. RecordNativeArray maskArray = new RecordNativeArray(0);
  123. funWriteLog.Invoke(outputFolder, $"urmStabilizer:{urmStabilizer}");
  124. if (urmStabilizer < 2)
  125. {
  126. var MatOuts = new List<float[,]>();
  127. var MatOutDirs = new List<float[,]>();
  128. var MatOutVels = new List<float[,]>();
  129. var PointList = new List<object[,]>();
  130. initSrMain = false;
  131. funWriteLog.Invoke(outputFolder, $"urmAnalysis.SR_Main start");
  132. var results = (MWCellArray)urmAnalysis.SR_Main(folder);
  133. funWriteLog.Invoke(outputFolder, $"urmAnalysis.SR_Main end");
  134. object[,] resultArrays = (object[,])results.ToArray();
  135. int packets = resultArrays.GetLength(1);
  136. for (int i = 0; i < packets; i++)
  137. {
  138. funWriteLog.Invoke(outputFolder, $"packets1:{i}/{packets}");
  139. object[,,] curresult = (object[,,])resultArrays[0, i];
  140. float[,] curMat = (float[,])curresult[0, 0, 0];
  141. float[,] curMatdir = (float[,])curresult[1, 0, 0];
  142. float[,] curMatvel = (float[,])curresult[2, 0, 0];
  143. object[,] curPoints = (object[,])curresult[7, 0, 0];
  144. if (!initSrMain)
  145. {
  146. initSrMain = true;
  147. _urmwidth = curMat.GetLength(1);
  148. _urmheight = curMat.GetLength(0);
  149. float[,] lambdaArray = (float[,])curresult[6, 0, 0];
  150. lambda = (double)lambdaArray[0, 0];
  151. aviFrames = curPoints.GetLength(1);
  152. bool[,] maskdata = (bool[,])curresult[10, 0, 0];
  153. double[,] Scalers = (double[,])curresult[8, 0, 0];
  154. //var res = _urmModeRecord.GetParameter(RecordParams.URMRes, 10.0);
  155. var res = 2.5;
  156. var scaleofx = Scalers[0, 0] * res;
  157. var scaleofy = Scalers[0, 1] * res;
  158. temp_ScaleOfPixel_x = scaleofx;
  159. temp_ScaleOfPixel_y = scaleofy;
  160. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_x, scaleofx);
  161. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_y, scaleofy);
  162. unsafe
  163. {
  164. maskArray.Resize(_urmwidth * _urmheight * sizeof(byte));
  165. byte* maskArrayPtr = (byte*)maskArray.Start.ToPointer();
  166. for (int k = 0; k < _urmheight; k++)
  167. {
  168. for (int j = 0; j < _urmwidth; j++)
  169. {
  170. var vel = maskdata[k, j];
  171. maskArrayPtr[j + k * _urmwidth] = vel ? (byte)1 : (byte)0;
  172. }
  173. }
  174. }
  175. }
  176. MatOuts.Add(curMat);
  177. MatOutDirs.Add(curMatdir);
  178. MatOutVels.Add(curMatvel);
  179. PointList.Add(curPoints);
  180. }
  181. funWriteLog.Invoke(outputFolder, $"packets1 end");
  182. RecordNativeArray matout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  183. RecordNativeArray matdirout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  184. RecordNativeArray matvelout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  185. // Console.WriteLine("Akio:_urmBeams is {0},_urmSamples is {1},packets is {2}", _urmwidth, _urmheight, packets);
  186. long nativelength = (long)_urmwidth * (long)_urmheight * 4L * (long)packets;
  187. NativeArray matOutNatveArray = new NativeArray(nativelength);
  188. NativeArray matOutDirNatveArray = new NativeArray(nativelength);
  189. NativeArray matOutVelNatveArray = new NativeArray(nativelength);
  190. funWriteLog.Invoke(outputFolder, $"unsafe 1");
  191. unsafe
  192. {
  193. float* matOutNatveArrayPtr = (float*)matOutNatveArray.Start.ToPointer();
  194. float* matOutDirNatveArrayPtr = (float*)matOutDirNatveArray.Start.ToPointer();
  195. float* matOutVelNatveArrayPtr = (float*)matOutVelNatveArray.Start.ToPointer();
  196. for (int i = 0; i < packets; i++)
  197. {
  198. funWriteLog.Invoke(outputFolder, $"packets2:{i}/{packets}");
  199. float* curmatOutNatveArrayPtr = matOutNatveArrayPtr + (long)i * (_urmwidth * _urmheight);
  200. float* curmatOutDirNatveArrayPtr = matOutDirNatveArrayPtr + (long)i * (_urmwidth * _urmheight);
  201. float* curmatOutVelNatveArrayPtr = matOutVelNatveArrayPtr + (long)i * (_urmwidth * _urmheight);
  202. float[,] MatOutArray = MatOuts[i];
  203. float[,] MatOutDirArray = MatOutDirs[i];
  204. float[,] MatOutVelArray = MatOutVels[i];
  205. unsafe
  206. {
  207. for (int k = 0; k < _urmheight; k++)
  208. {
  209. for (int j = 0; j < _urmwidth; j++)
  210. {
  211. var vel = MatOutArray[k, j];
  212. curmatOutNatveArrayPtr[j + k * _urmwidth] = vel;
  213. var veldir = MatOutDirArray[k, j];
  214. curmatOutDirNatveArrayPtr[j + k * _urmwidth] = veldir;
  215. var velvel = MatOutVelArray[k, j];
  216. curmatOutVelNatveArrayPtr[j + k * _urmwidth] = velvel;
  217. }
  218. }
  219. }
  220. }
  221. funWriteLog.Invoke(outputFolder, $"packets2 end");
  222. MatOuts.Clear();
  223. MatOutDirs.Clear();
  224. MatOutVels.Clear();
  225. funWriteLog.Invoke(outputFolder, $"PIA_URMGetLastResultFromPackets start");
  226. PIA_URMGetLastResultFromPackets(_handle, matOutNatveArray.Start, matOutDirNatveArray.Start, matOutVelNatveArray.Start, packets, _urmwidth,
  227. _urmheight, matout.Start, matdirout.Start, matvelout.Start);
  228. funWriteLog.Invoke(outputFolder, $"PIA_URMGetLastResultFromPackets end");
  229. matOutNatveArray.Dispose();
  230. matOutDirNatveArray.Dispose();
  231. matOutVelNatveArray.Dispose();
  232. SrcWidth = _urmwidth;
  233. SrcHeight = _urmheight;
  234. srcArray?.Dispose();
  235. srcArray = new NativeArray(SrcWidth * SrcHeight * 8);
  236. funWriteLog.Invoke(outputFolder, $"NativeArray init end");
  237. unsafe
  238. {
  239. funWriteLog.Invoke(outputFolder, $"unsafe srcArray");
  240. double* img = (double*)srcArray.Start.ToPointer();
  241. double* matSrc = (double*)matout.Start.ToPointer();
  242. funWriteLog.Invoke(outputFolder, $"SrcWidth * SrcHeight 1:{SrcWidth * SrcHeight}");
  243. for (int i = 0; i < SrcWidth * SrcHeight; i++)
  244. {
  245. img[i] = matSrc[i];
  246. }
  247. }
  248. funWriteLog.Invoke(outputFolder, $"WriteArrayToFile srcArray.bin start");
  249. WriteArrayToFile(Path.Combine(outputFolder, "./srcArray.bin"), srcArray, SrcWidth * SrcHeight);
  250. funWriteLog.Invoke(outputFolder, $"WriteArrayToFile srcArray.bin end");
  251. srcArraydir?.Dispose();
  252. srcArraydir = new NativeArray(SrcWidth * SrcHeight * 8);
  253. unsafe
  254. {
  255. double* img = (double*)srcArraydir.Start.ToPointer();
  256. double* matSrc = (double*)matdirout.Start.ToPointer();
  257. funWriteLog.Invoke(outputFolder, $"SrcWidth * SrcHeight 2:{SrcWidth * SrcHeight}");
  258. for (int i = 0; i < SrcWidth * SrcHeight; i++)
  259. {
  260. img[i] = matSrc[i];
  261. }
  262. }
  263. funWriteLog.Invoke(outputFolder, $"WriteArrayToFile srcArraydir.bin start");
  264. WriteArrayToFile(Path.Combine(outputFolder, "./srcArraydir.bin"), srcArraydir, SrcWidth * SrcHeight);
  265. funWriteLog.Invoke(outputFolder, $"WriteArrayToFile srcArraydir.bin end");
  266. srcArrayvel?.Dispose();
  267. srcArrayvel = new NativeArray(SrcWidth * SrcHeight * 8);
  268. unsafe
  269. {
  270. double* img = (double*)srcArrayvel.Start.ToPointer();
  271. double* matSrc = (double*)matvelout.Start.ToPointer();
  272. funWriteLog.Invoke(outputFolder, $"SrcWidth * SrcHeight 3:{SrcWidth * SrcHeight}");
  273. for (int i = 0; i < SrcWidth * SrcHeight; i++)
  274. {
  275. img[i] = matSrc[i];
  276. }
  277. }
  278. funWriteLog.Invoke(outputFolder, $"WriteArrayToFile srcArrayvel.bin start");
  279. WriteArrayToFile(Path.Combine(outputFolder, "./srcArrayvel.bin"), srcArrayvel, SrcWidth * SrcHeight);
  280. funWriteLog.Invoke(outputFolder, $"WriteArrayToFile srcArrayvel.bin end");
  281. //_urmModeRecord.SetParameter(RecordParams.URMDenArray, matout, TimeStamp.ErrorTime);
  282. //_urmModeRecord.SetParameter(RecordParams.URMDirArray, matdirout, TimeStamp.ErrorTime);
  283. //_urmModeRecord.SetParameter(RecordParams.URMVelArray, matvelout, TimeStamp.ErrorTime);
  284. //_urmModeRecord.SetParameter(RecordParams.URMMask, maskArray, TimeStamp.ErrorTime);
  285. //_urmModeRecord.SetParameter(RecordParams.URMSrcHeight, _urmheight,TimeStamp.ErrorTime);
  286. //_urmModeRecord.SetParameter(RecordParams.URMSrcWidth, _urmwidth, TimeStamp.ErrorTime);
  287. }
  288. List<List<SrPoint>> CombPointsList = new List<List<SrPoint>>();
  289. int[] PointNumList = new int[aviFrames];
  290. //List<URMPoint> pointsList = new List<URMPoint>();
  291. for (int i = 0; i < aviFrames; i++)
  292. {
  293. funWriteLog.Invoke(outputFolder, $"aviFrames:{i}/{aviFrames}");
  294. int PointNum = 0;
  295. List<SrPoint> curPointsList = new List<SrPoint>();
  296. for (int j = 0; j < PointList.Count; j++)
  297. {
  298. funWriteLog.Invoke(outputFolder, $"PointList:{j}/{PointList.Count}");
  299. object[,] curpointArray = PointList[j];
  300. if (curpointArray[0, i] is double[,])
  301. {
  302. double[,] CurPointsArray = (double[,])curpointArray[0, i];
  303. var curPointsCount = CurPointsArray.GetLength(0);
  304. PointNum += curPointsCount;
  305. for (int k = 0; k < curPointsCount; k++)
  306. {
  307. //URMPoint curPoint = new URMPoint();
  308. SrPoint curSrPoint = new SrPoint();
  309. //curPoint.X = (float)CurPointsArray[k, 0];
  310. //curPoint.Y = (float)CurPointsArray[k, 1];
  311. //curPoint.vel = (float)CurPointsArray[k, 2];
  312. curSrPoint.X = (float)CurPointsArray[k, 0];
  313. curSrPoint.Y = (float)CurPointsArray[k, 1];
  314. curSrPoint.vel = (float)CurPointsArray[k, 2];
  315. //pointsList.Add(curPoint);
  316. curPointsList.Add(curSrPoint);
  317. }
  318. }
  319. else if (curpointArray[0, i] is float[,])
  320. {
  321. float[,] CurPointsArray = (float[,])curpointArray[0, i];
  322. var curPointsCount = CurPointsArray.GetLength(0);
  323. PointNum += curPointsCount;
  324. for (int k = 0; k < curPointsCount; k++)
  325. {
  326. //URMPoint curPoint = new URMPoint();
  327. SrPoint curSrPoint = new SrPoint();
  328. //curPoint.X = CurPointsArray[k, 0];
  329. //curPoint.Y = CurPointsArray[k, 1];
  330. //curPoint.vel = CurPointsArray[k, 2];
  331. curSrPoint.X = (float)CurPointsArray[k, 0];
  332. curSrPoint.Y = (float)CurPointsArray[k, 1];
  333. curSrPoint.vel = (float)CurPointsArray[k, 2];
  334. //pointsList.Add(curPoint);
  335. curPointsList.Add(curSrPoint);
  336. }
  337. }
  338. }
  339. CombPointsList.Add(curPointsList);
  340. PointNumList[i] = PointNum;
  341. }
  342. analysisDataPointNumList = PointNumList;
  343. analysisDataPointNumListPoints = CombPointsList;
  344. //var pointsarray = pointsList.ToArray();
  345. //_urmModeRecord.SetParameter(RecordParams.URMPoints, pointsarray, TimeStamp.ErrorTime);
  346. //_urmModeRecord.SetParameter(RecordParams.URMPointNums, PointNumList, TimeStamp.ErrorTime);
  347. }
  348. else
  349. {
  350. funWriteLog.Invoke(outputFolder, $"urmAnalysis.SR_Main:start");
  351. var result = (MWStructArray)urmAnalysis.SR_Main(folder);
  352. var MatOut = (MWNumericArray)result.GetField("MatOut");
  353. var MatOut_zdir = (MWNumericArray)result.GetField("MatOut_zdir");
  354. var MatOut_vel = (MWNumericArray)result.GetField("MatOut_vel");
  355. var llz = (MWNumericArray)result.GetField("llz");
  356. var llx = (MWNumericArray)result.GetField("llx");
  357. var lambda = (MWNumericArray)result.GetField("lambda");
  358. var Points = (MWCellArray)result.GetField("Points");
  359. var Scalers = (MWNumericArray)result.GetField("SRscale");
  360. double[,] scalersArray = (double[,])Scalers.ToArray();
  361. //var res = _urmModeRecord.GetParameter(RecordParams.URMRes, 10.0);
  362. //var scaleofx = scalersArray[0, 0] * res;
  363. //var scaleofy = scalersArray[0, 1] * res;
  364. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_x, scaleofx);
  365. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_y, scaleofy);
  366. var ROIMask = (MWLogicalArray)result.GetField("ROIMask");
  367. double[,] lambdaArray = (double[,])lambda.ToArray();
  368. //var lambda1 = lambdaArray[0, 0];
  369. bool[,] maskdata = (bool[,])ROIMask.ToArray();
  370. double[,] MatOutArray = (double[,])MatOut.ToArray();
  371. double[,] MatOutDirArray = (double[,])MatOut_zdir.ToArray();
  372. double[,] MatOutVelArray = (double[,])MatOut_vel.ToArray();
  373. _urmwidth = MatOutArray.GetLength(1);
  374. _urmheight = MatOutArray.GetLength(0);
  375. funWriteLog.Invoke(outputFolder, $"RecordNativeArray:start");
  376. RecordNativeArray matout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  377. RecordNativeArray matdirout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  378. RecordNativeArray matvelout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  379. maskArray.Resize(_urmwidth * _urmheight * sizeof(byte));
  380. unsafe
  381. {
  382. double* matOutNatveArrayPtr = (double*)matout.Start.ToPointer();
  383. double* matOutDirNatveArrayPtr = (double*)matdirout.Start.ToPointer();
  384. double* matOutVelNatveArrayPtr = (double*)matvelout.Start.ToPointer();
  385. byte* maskArrayPtr = (byte*)maskArray.Start.ToPointer();
  386. for (int i = 0; i < _urmheight; i++)
  387. {
  388. funWriteLog.Invoke(outputFolder, $"_urmheight:{i}/{_urmheight}");
  389. for (int j = 0; j < _urmwidth; j++)
  390. {
  391. funWriteLog.Invoke(outputFolder, $"_urmwidth:{j}/{_urmwidth}");
  392. var vel = MatOutArray[i, j];
  393. matOutNatveArrayPtr[j + i * _urmwidth] = vel;
  394. var veldir = MatOutDirArray[i, j];
  395. matOutDirNatveArrayPtr[j + i * _urmwidth] = veldir;
  396. var velvel = MatOutVelArray[i, j];
  397. matOutVelNatveArrayPtr[j + i * _urmwidth] = velvel;
  398. var maskvel = maskdata[i, j];
  399. maskArrayPtr[j + i * _urmwidth] = maskvel ? (byte)1 : (byte)0;
  400. }
  401. }
  402. }
  403. object[,] pointArray = (object[,])Points.ToArray();
  404. aviFrames = Points.Dimensions[1];
  405. //List<URMPoint> pointsList = new List<URMPoint>();
  406. int[] PointNumList = new int[aviFrames];
  407. for (int i = 0; i < aviFrames; i++)
  408. {
  409. funWriteLog.Invoke(outputFolder, $"aviFrames2:{i}/{aviFrames}");
  410. float[,] CurPointsArray = (float[,])pointArray[0, i];
  411. var curPointsCount = CurPointsArray.GetLength(0);
  412. for (int k = 0; k < curPointsCount; k++)
  413. {
  414. funWriteLog.Invoke(outputFolder, $"curPointsCount2:{k}/{curPointsCount}");
  415. //URMPoint curPoint = new URMPoint();
  416. //curPoint.X = CurPointsArray[k, 0];
  417. //curPoint.Y = CurPointsArray[k, 1];
  418. //curPoint.vel = CurPointsArray[k, 2];
  419. //pointsList.Add(curPoint);
  420. }
  421. PointNumList[i] = curPointsCount;
  422. }
  423. //var pointsarray = pointsList.ToArray();
  424. }
  425. /// 尝试获取图像并保存
  426. var DensityColorParam = srColorBarParams["Density"];
  427. var lambda1 = lambda;
  428. int srcwidth = SrcWidth;
  429. int srcheight = SrcHeight;
  430. int downsampleIndex = 3;
  431. int dstwidthbeforeResize = (int)(srcwidth * downsampleIndex * (temp_ScaleOfPixel_y / temp_ScaleOfPixel_x) / 2.5 + 0.5);
  432. int dstheightbeforeResiz = (int)(srcheight * downsampleIndex / 2.5 + 0.5);
  433. double widthScale = ScreenWidth / dstwidthbeforeResize;
  434. double heightScale = ScreenHeight / dstheightbeforeResiz;
  435. double ScanScale = widthScale < heightScale ? widthScale : heightScale;
  436. //int dstwidth = (int)(dstwidthbeforeResize * ScanScale + 0.5);
  437. //int dstheight = (int)(dstheightbeforeResiz * ScanScale + 0.5);
  438. int dstwidth = (int)(dstwidthbeforeResize);
  439. int dstheight = (int)(dstheightbeforeResiz);
  440. //var cmPerPixel = GetCmPerPixel(srParams, ScanScale, lambda1);
  441. //var scaleBar = _adorners.FirstOrDefault(x => x is TissueScaleBar) as TissueScaleBar;
  442. //var logoMark = _adorners.FirstOrDefault(x => x is LogoMark) as LogoMark;
  443. double tempmax = 0;
  444. double tempmin = 0;
  445. funWriteLog.Invoke(outputFolder, $"NativeArray48 start");
  446. NativeArray dstArray = new NativeArray(4 * dstwidth * dstheight);
  447. NativeArray dstArrayu = new NativeArray(8 * dstwidth * dstheight); //需要保存的原始八位数据
  448. funWriteLog.Invoke(outputFolder, $"GetSRColorMap start");
  449. GetSRColorMap(DensityColorParam.ColorMap, ref Densitycolormap, out Densitycolormaplength);
  450. funWriteLog.Invoke(outputFolder, $"GetSRColorMap end");
  451. var srParams = new SrParams();
  452. srParams.Res = 1;
  453. srParams.ScaleOfPixel_x = temp_ScaleOfPixel_x;
  454. srParams.ScaleOfPixel_y = temp_ScaleOfPixel_y;
  455. srParams.DownsampleIndex = 1;
  456. funWriteLog.Invoke(outputFolder, $"URMAnalysisProcessV1.PIA_SetSrParam start");
  457. URMAnalysisProcessV1.PIA_SetSrParam(_handle_v1, srParams);
  458. funWriteLog.Invoke(outputFolder, $"URMAnalysisProcessV1.PIA_SetSrParam end");
  459. try
  460. {
  461. funWriteLog.Invoke(outputFolder, $"URMAnalysisProcessV1.PIA_SRGetDensityImg start");
  462. bool success = URMAnalysisProcessV1.PIA_SRGetDensityImg(_handle_v1, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Densitycolormap.Start, Densitycolormaplength, lambda1, ref tempmax, ref tempmin, 1);
  463. funWriteLog.Invoke(outputFolder, $"URMAnalysisProcessV1.PIA_SRGetDensityImg end");
  464. // Console.WriteLine("PIA_SRGetDensityImg: " + success);
  465. funWriteLog.Invoke(outputFolder, $"SaveDstImg.den start");
  466. SaveDstImg(dstwidth, dstheight, dstArray, "den", outputFolder);
  467. funWriteLog.Invoke(outputFolder, $"SaveDstImg.den end");
  468. }
  469. catch (Exception e)
  470. {
  471. // Console.WriteLine("An error occurred: " + e.Message);
  472. }
  473. /// Direction
  474. var DirectionColorParam = srColorBarParams["Direction"];
  475. funWriteLog.Invoke(outputFolder, $"GetSRColorMap Directioncolormap Directioncolormaplength start");
  476. GetSRColorMap(DirectionColorParam.ColorMap, ref Directioncolormap, out Directioncolormaplength);
  477. funWriteLog.Invoke(outputFolder, $"GetSRColorMap Directioncolormap Directioncolormaplength end");
  478. dstArrayu = new NativeArray(dstwidth * dstheight);
  479. try
  480. {
  481. funWriteLog.Invoke(outputFolder, $"URMAnalysisProcessV1.PIA_SRGetDirectionImg 123 start");
  482. bool success = URMAnalysisProcessV1.PIA_SRGetDirectionImg(_handle_v1, srcArraydir.Start, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Directioncolormap.Start, Directioncolormaplength, lambda1, ref tempmax, ref tempmin, 5);
  483. funWriteLog.Invoke(outputFolder, $"URMAnalysisProcessV1.PIA_SRGetDirectionImg 123 end");
  484. // Console.WriteLine("PIA_SRGetDirectionImg: " + success);
  485. funWriteLog.Invoke(outputFolder, $"SaveDstImg。dir 123 start");
  486. SaveDstImg(dstwidth, dstheight, dstArray, "dir", outputFolder);
  487. funWriteLog.Invoke(outputFolder, $"SaveDstImg。dir 123 end");
  488. }
  489. catch (Exception e)
  490. {
  491. // Console.WriteLine("An error occurred: " + e.Message);
  492. }
  493. /// Vel
  494. var VelColorParam = srColorBarParams["Vel"];
  495. funWriteLog.Invoke(outputFolder, $"1");
  496. GetSRColorMap(VelColorParam.ColorMap, ref Velcolormap, out Velcolormaplength);
  497. funWriteLog.Invoke(outputFolder, $"2");
  498. dstArrayu = new NativeArray(8 * dstwidth * dstheight);
  499. funWriteLog.Invoke(outputFolder, $"3");
  500. try
  501. {
  502. funWriteLog.Invoke(outputFolder, $"4");
  503. bool success = URMAnalysisProcessV1.PIA_SRGetVelImg(_handle_v1, srcArrayvel.Start, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Velcolormap.Start, Velcolormaplength, lambda1, ref tempmax, ref tempmin, 1);
  504. funWriteLog.Invoke(outputFolder, $"5");
  505. // Console.WriteLine("PIA_SRGetVelImg: " + success);
  506. funWriteLog.Invoke(outputFolder, $"6");
  507. SaveDstImg(dstwidth, dstheight, dstArray, "vel", outputFolder);
  508. funWriteLog.Invoke(outputFolder, $"7");
  509. }
  510. catch (Exception e)
  511. {
  512. // Console.WriteLine("An error occurred: " + e.Message);
  513. }
  514. // 生成 avi
  515. //生成avi 先设置背景图
  516. //int dstwidthback = (int)(srcwidth * srParams.DownsampleIndexVideo * (srParams.ScaleOfPixel_y / srParams.ScaleOfPixel_x) / srParams.Res + 0.5);
  517. //int dstheightback = (int)(srcheight * srParams.DownsampleIndexVideo / srParams.Res + 0.5);
  518. int dstwidthback = srcwidth;
  519. int dstheightback = srcheight;
  520. funWriteLog.Invoke(outputFolder, $"8");
  521. URMAnalysisProcessV1.PIA_CalBackgroundImg(_handle_v1, srcArray.Start, srcArraydir.Start, srcwidth, srcheight, dstwidthback, dstheightback);
  522. funWriteLog.Invoke(outputFolder, $"9");
  523. int aviwidth = srcwidth;
  524. int aviheight = srcheight;
  525. aviwidth += (aviwidth % 2);
  526. aviheight += (aviheight % 2);
  527. int[] pointlengths = analysisDataPointNumList;
  528. var frams = pointlengths.Length;
  529. funWriteLog.Invoke(outputFolder, $"10");
  530. NativeArray dstMats = new NativeArray((long)aviheight * aviwidth * 4 * frams);//所有的图都保存在这个段内存中
  531. funWriteLog.Invoke(outputFolder, $"11");
  532. unsafe
  533. {
  534. SrPoint*[] DrawPoints = new SrPoint*[frams];
  535. List<List<SrPoint>> CombPoints = analysisDataPointNumListPoints;
  536. for (int i = 0; i < frams; i++)
  537. {
  538. funWriteLog.Invoke(outputFolder, $"12 {i}/{frams}");
  539. SrPoint[] curPoints = CombPoints[i].ToArray();
  540. if (curPoints == null || curPoints.Length == 0)
  541. {
  542. DrawPoints[i] = null;
  543. }
  544. else
  545. {
  546. fixed (SrPoint* curPointsptr = &curPoints[0])
  547. {
  548. DrawPoints[i] = curPointsptr;
  549. }
  550. }
  551. }
  552. funWriteLog.Invoke(outputFolder, $"13");
  553. fixed (SrPoint** AllPointsPtr = &DrawPoints[0])
  554. {
  555. fixed (int* pointlengthsptr = &pointlengths[0])
  556. {
  557. var AviColorParam = srColorBarParams["SRAvi"];
  558. funWriteLog.Invoke(outputFolder, $"14");
  559. GetSRColorMap(AviColorParam.ColorMap, ref Avicolormap, out AvicolormapLength);
  560. funWriteLog.Invoke(outputFolder, $"15");
  561. URMAnalysisProcessV1.PIA_CalSrAvi(_handle_v1, AllPointsPtr, frams, pointlengthsptr, dstMats.Start, aviwidth,
  562. aviheight, Avicolormap.Start, AvicolormapLength);
  563. funWriteLog.Invoke(outputFolder, $"16");
  564. }
  565. }
  566. }
  567. var aviframesize = aviwidth * aviheight * 4;
  568. var curptr = dstMats.Start;
  569. // 获取当前时间戳
  570. funWriteLog.Invoke(outputFolder, $"17");
  571. string timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
  572. for (var i = 0; i < frams; i++)
  573. {
  574. funWriteLog.Invoke(outputFolder, $"18 {i}/{frams}");
  575. var curMatptr = curptr;
  576. SaveDstImgByPtr(aviwidth, aviheight, curMatptr, i.ToString(), outputFolder);
  577. curptr = curMatptr + aviframesize;
  578. }
  579. dstArray.Dispose();
  580. dstArrayu.Dispose();
  581. return true;
  582. }
  583. public bool URMAnalysisFromData(string outputFolder)
  584. {
  585. LoadColorBarParams();
  586. SrcWidth = 320;
  587. SrcHeight = 1185;
  588. temp_ScaleOfPixel_x = 0.212260852677748;
  589. temp_ScaleOfPixel_y = 0.493506493506494;
  590. lambda = 0.4;
  591. if (!File.Exists("./srcArray.bin"))
  592. {
  593. // Console.WriteLine("Error: File not found - " + "srcArray.bin");
  594. return false;
  595. }
  596. srcArray = ReadArrayFromFile("./srcArray.bin", SrcWidth * SrcHeight);
  597. srcArraydir = ReadArrayFromFile("./srcArraydir.bin", SrcWidth * SrcHeight);
  598. srcArrayvel = ReadArrayFromFile("./srcArrayvel.bin", SrcWidth * SrcHeight);
  599. /// 尝试获取图像并保存
  600. var lambda1 = lambda;
  601. int srcwidth = SrcWidth;
  602. int srcheight = SrcHeight;
  603. int downsampleIndex = 3;
  604. int dstwidthbeforeResize = (int)(srcwidth * downsampleIndex * (temp_ScaleOfPixel_y / temp_ScaleOfPixel_x) / 2.5 + 0.5);
  605. int dstheightbeforeResiz = (int)(srcheight * downsampleIndex / 2.5 + 0.5);
  606. double widthScale = ScreenWidth / dstwidthbeforeResize;
  607. double heightScale = ScreenHeight / dstheightbeforeResiz;
  608. double ScanScale = widthScale < heightScale ? widthScale : heightScale;
  609. //int dstwidth = (int)(dstwidthbeforeResize * ScanScale + 0.5);
  610. //int dstheight = (int)(dstheightbeforeResiz * ScanScale + 0.5);
  611. int dstwidth = (int)(dstwidthbeforeResize);
  612. int dstheight = (int)(dstheightbeforeResiz);
  613. double tempmax = 0;
  614. double tempmin = 0;
  615. NativeArray dstArray = new NativeArray(4 * dstwidth * dstheight);
  616. NativeArray dstArrayu = new NativeArray(8 * dstwidth * dstheight); //需要保存的原始八位数据
  617. var srParams = new SrParams();
  618. srParams.Res = 1;
  619. srParams.ScaleOfPixel_x = temp_ScaleOfPixel_x;
  620. srParams.ScaleOfPixel_y = temp_ScaleOfPixel_y;
  621. srParams.DownsampleIndex = 1;
  622. URMAnalysisProcessV1.PIA_SetSrParam(_handle_v1, srParams);
  623. // Density
  624. var DensityColorParam = srColorBarParams["Density"];
  625. GetSRColorMap(DensityColorParam.ColorMap, ref Densitycolormap, out Densitycolormaplength);
  626. try
  627. {
  628. bool success = URMAnalysisProcessV1.PIA_SRGetDensityImg(_handle_v1, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Densitycolormap.Start, Densitycolormaplength, lambda1, ref tempmax, ref tempmin, 1);
  629. byte[] dstMatu = new byte[8 * dstwidth * dstheight];
  630. Marshal.Copy(dstArrayu.Start, dstMatu, 0, 8 * dstwidth * dstheight);
  631. WriteByteArrayToFile("./urmMeasureData.bin", dstMatu);
  632. // Console.WriteLine("PIA_SRGetDensityImg: " + success);
  633. SaveDstImg(dstwidth, dstheight, dstArray, "den", outputFolder);
  634. }
  635. catch (Exception e)
  636. {
  637. // Console.WriteLine("An error occurred: " + e.Message);
  638. }
  639. /// Direction
  640. var DirectionColorParam = srColorBarParams["Direction"];
  641. GetSRColorMap(DirectionColorParam.ColorMap, ref Directioncolormap, out Directioncolormaplength);
  642. dstArrayu = new NativeArray(dstwidth * dstheight);
  643. try
  644. {
  645. bool success = URMAnalysisProcessV1.PIA_SRGetDirectionImg(_handle_v1, srcArraydir.Start, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Directioncolormap.Start, Directioncolormaplength, lambda1, ref tempmax, ref tempmin, 5);
  646. // Console.WriteLine("PIA_SRGetDirectionImg: " + success);
  647. SaveDstImg(dstwidth, dstheight, dstArray, "dir", outputFolder);
  648. }
  649. catch (Exception e)
  650. {
  651. // Console.WriteLine("An error occurred: " + e.Message);
  652. }
  653. /// Vel
  654. var VelColorParam = srColorBarParams["Vel"];
  655. GetSRColorMap(VelColorParam.ColorMap, ref Velcolormap, out Velcolormaplength);
  656. dstArrayu = new NativeArray(8 * dstwidth * dstheight);
  657. try
  658. {
  659. bool success = URMAnalysisProcessV1.PIA_SRGetVelImg(_handle_v1, srcArrayvel.Start, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Velcolormap.Start, Velcolormaplength, lambda1, ref tempmax, ref tempmin, 1);
  660. // Console.WriteLine("PIA_SRGetVelImg: " + success);
  661. SaveDstImg(dstwidth, dstheight, dstArray, "vel", outputFolder);
  662. }
  663. catch (Exception e)
  664. {
  665. // Console.WriteLine("An error occurred: " + e.Message);
  666. }
  667. // 生成 avi
  668. //生成avi 先设置背景图
  669. //int dstwidthback = (int)(srcwidth * srParams.DownsampleIndexVideo * (srParams.ScaleOfPixel_y / srParams.ScaleOfPixel_x) / srParams.Res + 0.5);
  670. //int dstheightback = (int)(srcheight * srParams.DownsampleIndexVideo / srParams.Res + 0.5);
  671. //int dstwidthback = srcwidth;
  672. //int dstheightback = srcheight;
  673. //URMAnalysisProcessV1.PIA_CalBackgroundImg(_handle_v1, srcArray.Start, srcArraydir.Start, srcwidth, srcheight, dstwidthback, dstheightback);
  674. //int aviwidth = srcwidth;
  675. //int aviheight = srcheight;
  676. //aviwidth += (aviwidth % 2);
  677. //aviheight += (aviheight % 2);
  678. //int[] pointlengths = analysisDataPointNumList;
  679. //var frams = pointlengths.Length;
  680. //NativeArray dstMats = new NativeArray((long)aviheight * aviwidth * 4 * frams);//所有的图都保存在这个段内存中
  681. //unsafe
  682. //{
  683. // SrPoint*[] DrawPoints = new SrPoint*[frams];
  684. // List<List<SrPoint>> CombPoints = analysisDataPointNumListPoints;
  685. // for (int i = 0; i < frams; i++)
  686. // {
  687. // SrPoint[] curPoints = CombPoints[i].ToArray();
  688. // if (curPoints == null || curPoints.Length == 0)
  689. // {
  690. // DrawPoints[i] = null;
  691. // }
  692. // else
  693. // {
  694. // fixed (SrPoint* curPointsptr = &curPoints[0])
  695. // {
  696. // DrawPoints[i] = curPointsptr;
  697. // }
  698. // }
  699. // }
  700. // fixed (SrPoint** AllPointsPtr = &DrawPoints[0])
  701. // {
  702. // fixed (int* pointlengthsptr = &pointlengths[0])
  703. // {
  704. // var AviColorParam = srColorBarParams["SRAvi"];
  705. // GetSRColorMap(AviColorParam.ColorMap, ref Avicolormap, out AvicolormapLength);
  706. // URMAnalysisProcessV1.PIA_CalSrAvi(_handle_v1, AllPointsPtr, frams, pointlengthsptr, dstMats.Start, aviwidth,
  707. // aviheight, Avicolormap.Start, AvicolormapLength);
  708. // }
  709. // }
  710. //}
  711. //var aviframesize = aviwidth * aviheight * 4;
  712. //var curptr = dstMats.Start;
  713. //for (var i = 0; i < frams; i++)
  714. //{
  715. // var curMatptr = curptr;
  716. // SaveDstImgByPtr(aviwidth, aviheight, curMatptr, i.ToString());
  717. // curptr = curMatptr + aviframesize;
  718. //}
  719. dstArray.Dispose();
  720. dstArrayu.Dispose();
  721. return true;
  722. }
  723. private void GetSRColorMap(string colorMap, ref NativeArray colorMapArray, out int talbelength)
  724. {
  725. ColorMapConfig config = new ColorMapConfig(colorMap);
  726. colorMapArray?.Dispose();
  727. var talbelengthlist = new List<int>();
  728. var rValue = config.getValueR();
  729. var gValue = config.getValueG();
  730. var bValue = config.getValueB();
  731. talbelength = config.getValueLength();
  732. var result = talbelength > 0;
  733. colorMapArray = new NativeArray(talbelength * 4);
  734. if (result)
  735. {
  736. unsafe
  737. {
  738. byte* colormapptr = (byte*)colorMapArray.Start.ToPointer();
  739. for (int i = 0; i < talbelength; i++)
  740. {
  741. colormapptr[4 * i] = (byte)bValue[i];
  742. colormapptr[4 * i + 1] = (byte)gValue[i];
  743. colormapptr[4 * i + 2] = (byte)rValue[i];
  744. colormapptr[4 * i + 3] = 0;
  745. }
  746. }
  747. }
  748. }
  749. private void LoadColorBarParams()
  750. {
  751. srColorBarParams = new Dictionary<string, SRColorBarParam>();
  752. //var colorConfigs = ResourceManager.GetValue("SRMap", "SRMap", string.Empty);
  753. var colorConfigs = "[\"Density SRColorMap:ColorMap1\" \"Direction SRColorMap:ColorMap2\" \"Vel SRColorMap:ColorMap3\" \"SRAvi SRColorMap:ColorMap4\"]";
  754. if (!string.IsNullOrEmpty(colorConfigs))
  755. {
  756. EnumMeta enumMeta = ParamMetaSection.CreateMeta(colorConfigs) as EnumMeta;
  757. if (enumMeta?.Values.Length > 0)
  758. {
  759. foreach (var config in enumMeta.Values)
  760. {
  761. SRColorBarParam curBarParam = new SRColorBarParam();
  762. var elements = config.Split(' ');
  763. if (elements.Length == 2)
  764. {
  765. var title = elements[0].Trim();
  766. var mapConfigs = elements[1].Trim();
  767. curBarParam.ColorMap = mapConfigs;
  768. srColorBarParams.Add(title, curBarParam);
  769. }
  770. }
  771. }
  772. }
  773. }
  774. public void TransposeImg(IntPtr imgPtr, int beams, int samples)
  775. {
  776. PIA_TransposeImg(_handle, imgPtr, beams, samples);
  777. }
  778. static bool SaveDstImg(int dstWidth, int dstHeight, NativeArray dstArray, string imgType, string outputFolder)
  779. {
  780. unsafe
  781. {
  782. byte* ptr = (byte*)dstArray.Start.ToPointer();
  783. for (int i = 0; i < dstWidth * dstHeight; i++)
  784. {
  785. int offset = i * 4;
  786. byte blue = ptr[offset];
  787. byte green = ptr[offset + 1];
  788. byte red = ptr[offset + 2];
  789. if (blue + green + red > 0)
  790. {
  791. ptr[offset + 3] = 255; // 设置alpha通道为不透明
  792. }
  793. else
  794. {
  795. ptr[offset + 3] = 0; // 设置alpha通道为透明
  796. }
  797. }
  798. }
  799. var converter = new ImageConverter();
  800. if (converter.ConvertToImage(dstWidth, dstHeight, dstArray.Start, (int)dstArray.Length, out SKBitmap bitmap))
  801. {
  802. // 使用bitmap,例如保存为文件
  803. using (var image = SKImage.FromBitmap(bitmap))
  804. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  805. {
  806. // 将数据编码为Base64字符串并打印
  807. var base64String = Convert.ToBase64String(data.ToArray());
  808. // Console.WriteLine(base64String);
  809. // 获取当前时间戳
  810. string timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
  811. // 获取图像分辨率
  812. string resolution = $"{dstWidth}x{dstHeight}";
  813. // 创建带有时间戳和分辨率的文件名
  814. string fileName = $"{imgType}_output_{timeStamp}_{resolution}.png";
  815. var filePath = Path.Combine(outputFolder, fileName);
  816. using (var stream = File.OpenWrite(filePath))
  817. {
  818. data.SaveTo(stream);
  819. }
  820. }
  821. // 释放资源
  822. bitmap.Dispose();
  823. }
  824. return true;
  825. }
  826. static bool SaveDstImgByPtr(int dstWidth, int dstHeight, IntPtr intPtr, string index, string parentFolderName)
  827. {
  828. unsafe
  829. {
  830. byte* ptr = (byte*)intPtr;
  831. for (int i = 0; i < dstWidth * dstHeight; i++)
  832. {
  833. int offset = i * 4;
  834. byte blue = ptr[offset];
  835. byte green = ptr[offset + 1];
  836. byte red = ptr[offset + 2];
  837. if (blue + green + red > 0)
  838. {
  839. ptr[offset + 3] = 255; // 设置alpha通道为不透明
  840. }
  841. else
  842. {
  843. ptr[offset + 3] = 0; // 设置alpha通道为透明
  844. }
  845. }
  846. }
  847. var converter = new ImageConverter();
  848. if (converter.ConvertToImage(dstWidth, dstHeight, intPtr, dstWidth * dstHeight * 4, out SKBitmap bitmap))
  849. {
  850. // 使用bitmap,例如保存为文件
  851. using (var image = SKImage.FromBitmap(bitmap))
  852. using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
  853. {
  854. // 将数据编码为Base64字符串并打印
  855. var base64String = Convert.ToBase64String(data.ToArray());
  856. // 获取图像分辨率
  857. string resolution = $"{dstWidth}x{dstHeight}";
  858. // 创建带有时间戳和分辨率的文件名
  859. string fileName = $"avi_{index}_output_{resolution}.png";
  860. // 确保父级文件夹存在,如果不存在则创建
  861. var aviFolder = Path.Combine(parentFolderName, "avi");
  862. if (!Directory.Exists(aviFolder))
  863. {
  864. Directory.CreateDirectory(aviFolder);
  865. }
  866. // 生成文件路径
  867. string filePath = Path.Combine(aviFolder, fileName);
  868. using (var stream = File.OpenWrite(filePath))
  869. {
  870. data.SaveTo(stream);
  871. }
  872. }
  873. // 释放资源
  874. bitmap.Dispose();
  875. }
  876. return true;
  877. }
  878. static void WriteArrayToFile(string filePath, NativeArray array, int length)
  879. {
  880. using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create)))
  881. {
  882. unsafe
  883. {
  884. double* data = (double*)array.Start.ToPointer();
  885. for (int i = 0; i < length; i++)
  886. {
  887. writer.Write(data[i]);
  888. }
  889. }
  890. }
  891. }
  892. static NativeArray ReadArrayFromFile(string filePath, int length)
  893. {
  894. NativeArray array = new NativeArray(length * 8);
  895. using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
  896. {
  897. unsafe
  898. {
  899. double* data = (double*)array.Start.ToPointer();
  900. for (int i = 0; i < length; i++)
  901. {
  902. data[i] = reader.ReadDouble();
  903. }
  904. }
  905. }
  906. return array;
  907. }
  908. // 将 byte[] 数组写入文件
  909. public static void WriteByteArrayToFile(string filePath, byte[] array)
  910. {
  911. using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create)))
  912. {
  913. writer.Write(array);
  914. }
  915. }
  916. // 从文件读取 byte[] 数组
  917. public static byte[] ReadByteArrayFromFile(string filePath)
  918. {
  919. using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
  920. {
  921. long length = reader.BaseStream.Length;
  922. byte[] array = new byte[length];
  923. reader.Read(array, 0, (int)length);
  924. return array;
  925. }
  926. }
  927. }
  928. }
  929. public enum UrmImageType
  930. {
  931. Unknown,
  932. Raw,
  933. Den,
  934. Dir,
  935. Vel
  936. }
  937. [StructLayout(LayoutKind.Sequential), Serializable]
  938. public struct SrPoint
  939. {
  940. public float X;
  941. public float Y;
  942. public float vel;
  943. }
  944. [Serializable, StructLayout(LayoutKind.Sequential)]
  945. public class SrParams
  946. {
  947. //Todo 拆分C++需要的参数
  948. public double ScaleOfPixel_x { get; set; }
  949. public double ScaleOfPixel_y { get; set; }
  950. public double Res { get; set; }
  951. public double DownsampleIndex { get; set; }
  952. public double DownsampleIndexVideo { get; set; }
  953. public double VideoNorIndex { get; set; }
  954. public double IntPowerDen { get; set; }
  955. public double IntPowerDir { get; set; }
  956. public double SigmaGauss { get; set; }
  957. public double VessScale { get; set; }
  958. public double VelMaxValue { get; set; }
  959. public double VelMinValue { get; set; }
  960. public uint UrmLevel { get; set; }
  961. public uint VideoParameter { get; set; }
  962. public uint CaptureFrames { get; set; }
  963. public float FrequencyMin { get; set; }
  964. public string FrequencyMinUnit { get; set; }
  965. public float FrameRateDisplay { get; set; }
  966. public string FrameRateDisplayUnit { get; set; }
  967. public uint VSpeckle { get; set; }
  968. public uint Moco { get; set; }
  969. public UrmImageType ImageType { get; set; }
  970. public SrParams()
  971. {
  972. ScaleOfPixel_x = 1;
  973. ScaleOfPixel_y = 1;
  974. Res = 10;
  975. DownsampleIndex = 3.0;
  976. DownsampleIndexVideo = 1.5;
  977. VideoNorIndex = 2;
  978. IntPowerDen = 0.33;
  979. IntPowerDir = 0.25;
  980. SigmaGauss = 1.0;
  981. VessScale = 0.2;
  982. UrmLevel = 2;
  983. VideoParameter = 2;
  984. VelMaxValue = 1;
  985. VelMinValue = 0;
  986. }
  987. }
  988. public class ImageConverter
  989. {
  990. public bool ConvertToImage(int dstWidth, int dstHeight, IntPtr tempArray, int tempArrayLength, out SKBitmap bitmap)
  991. {
  992. // 确保传入的参数有效
  993. if (tempArray == IntPtr.Zero || tempArrayLength <= 0)
  994. {
  995. bitmap = null;
  996. return false;
  997. }
  998. // 创建一个SKImageInfo对象来描述图像的信息
  999. var info = new SKImageInfo(dstWidth, dstHeight, SKColorType.Bgra8888, SKAlphaType.Premul);
  1000. // 从内存数据创建SKBitmap
  1001. bitmap = new SKBitmap(info);
  1002. // 将内存数据拷贝到SKBitmap
  1003. bool success = bitmap.InstallPixels(info, tempArray, info.RowBytes, (addr, ctx) =>
  1004. {
  1005. /* 释放资源的回调函数 */
  1006. }, null);
  1007. return success;
  1008. }
  1009. }
  1010. public class URMAnalysisProcessV1
  1011. {
  1012. [DllImport("ImageProcessAlgWrapLib.dll")]
  1013. public static extern bool PIA_SRGetDensityImg(IntPtr handPtr, IntPtr srcMat, int srcWidth, int srcHeight,
  1014. IntPtr dstMat, IntPtr dstMatu, int dstWidth, int dstHeight, IntPtr colorMap, int colorMapLength, double lambda, ref double barmax, ref double barmin, double ScanScale);
  1015. [DllImport("ImageProcessAlgWrapLib.dll")]
  1016. public static extern bool PIA_SRGetDirectionImg(IntPtr handPtr, IntPtr srcMat, IntPtr srcDenmat, int srcWidth, int srcHeight,
  1017. IntPtr dstMat, IntPtr dstMatu, int dstWidth, int dstHeight, IntPtr colorMap, int colorMapLength, double lambda, ref double barmax, ref double barmin, double ScanScale);
  1018. [DllImport("ImageProcessAlgWrapLib.dll")]
  1019. public static extern bool PIA_SRGetVelImg(IntPtr handPtr, IntPtr srcMat, IntPtr srcDenmat, int srcWidth, int srcHeight,
  1020. IntPtr dstMat, IntPtr dstMatu, int dstWidth, int dstHeight, IntPtr colorMap, int colorMapLength, double lambda, ref double barmax, ref double barmin, double ScanScale);
  1021. [DllImport("ImageProcessAlgWrapLib.dll")]
  1022. public static extern void PIA_SetSrParam(IntPtr handPtr, SrParams srParams);
  1023. [DllImport("ImageProcessAlgWrapLib.dll")]
  1024. public static extern IntPtr PIA_CreateSrProcess();
  1025. [DllImport("ImageProcessAlgWrapLib.dll")]
  1026. public static extern void PIA_CalBackgroundImg(IntPtr handPtr, IntPtr srcMat, IntPtr srcdirMat, int srcWidth, int srcHeight, int dstWidth, int dstHeight);
  1027. [DllImport("ImageProcessAlgWrapLib.dll", CallingConvention = CallingConvention.Cdecl)]
  1028. public static extern unsafe bool PIA_CalSrAvi(IntPtr handPtr, SrPoint** Points, int framecount, int* PointsCounts,
  1029. IntPtr dstMats, int dstWidth, int dstHeight, IntPtr colorMap, int colorMapLength);
  1030. }