|
@@ -0,0 +1,702 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
+using System.Text;
|
|
|
+using MathWorks.MATLAB.NET.Arrays;
|
|
|
+using SR_Main;
|
|
|
+using URMPakcage.URM;
|
|
|
+
|
|
|
+using Vinno.DataManager.Data;
|
|
|
+using Vinno.DataManager.GraphTransform;
|
|
|
+using Vinno.DataManager.Infrastructure;
|
|
|
+using Vinno.DataManager.Modes;
|
|
|
+using Vinno.DataManager.Process;
|
|
|
+using Vinno.DataManager.Utilities;
|
|
|
+using Vinno.DataTypes;
|
|
|
+using Vinno.Infrastructure;
|
|
|
+
|
|
|
+using Vinno.Models.Base.Modes;
|
|
|
+using Vinno.Models.Base.Parameters;
|
|
|
+using Vinno.Models.Base.ParamMetas;
|
|
|
+using Vinno.Models.Base.ViewPorts;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+using Vinno.Models.Base;
|
|
|
+using SkiaSharp;
|
|
|
+
|
|
|
+namespace Vinno.Models.AdditionalFeatures.Functions.URM
|
|
|
+{
|
|
|
+ [StructLayout(LayoutKind.Sequential)]
|
|
|
+ public class URMAVIParam
|
|
|
+ {
|
|
|
+ public double Res { get; set; }
|
|
|
+ public double ScaleOfPixel_x { get; set; }
|
|
|
+ public double ScaleOfPixel_y { get; set; }
|
|
|
+ public double IntPowerDir { get; set; }
|
|
|
+ public double DownsampleIndexVideo { get; set; }
|
|
|
+ public IntPtr MaskArray { get; set; }
|
|
|
+ public URMAVIParam()
|
|
|
+ {
|
|
|
+ Res = 10;
|
|
|
+ ScaleOfPixel_x = 1.0;
|
|
|
+ ScaleOfPixel_y = 1.0;
|
|
|
+ IntPowerDir = 0.25;
|
|
|
+ DownsampleIndexVideo = 2;
|
|
|
+ MaskArray = IntPtr.Zero;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ public struct POINT
|
|
|
+ {
|
|
|
+ public int X;
|
|
|
+ public int Y;
|
|
|
+
|
|
|
+ public POINT(int x, int y)
|
|
|
+ {
|
|
|
+ X = x;
|
|
|
+ Y = y;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override string ToString()
|
|
|
+ {
|
|
|
+ return ("X:" + X + ", Y:" + Y);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public class URMAnalysisProcess
|
|
|
+ {
|
|
|
+
|
|
|
+ [DllImport("ImageProcessAlgWrapLib.dll")]
|
|
|
+ private static extern IntPtr PIA_CreateURMAnalysisDataProcess();
|
|
|
+ [DllImport("ImageProcessAlgWrapLib.dll")]
|
|
|
+ private static extern void PIA_URMAnalysisDataProcess_Release(IntPtr handPtr);
|
|
|
+ [DllImport("ImageProcessAlgWrapLib.dll")]
|
|
|
+ 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);
|
|
|
+ [DllImport("ImageProcessAlgWrapLib.dll")]
|
|
|
+ private static extern void PIA_TransposeImg(IntPtr handPtr, IntPtr srcdst, int beams, int samples);
|
|
|
+ [DllImport("ImageProcessAlgWrapLibOld.dll")]
|
|
|
+ private static extern bool PIA_SRGetDensityImg(IntPtr handPtr, IntPtr srcMat, int srcWidth, int srcHeight,
|
|
|
+ IntPtr dstMat, IntPtr dstMatu, int dstWidth, int dstHeight, IntPtr colorMap, int colorMapLength, double lambda, ref double barmax, ref double barmin, double ScanScale);
|
|
|
+ [DllImport("ImageProcessAlgWrapLibOld.dll")]
|
|
|
+ private static extern void PIA_SetSrParam(IntPtr handPtr, SrParams srParams);
|
|
|
+
|
|
|
+ [DllImport("user32.dll", SetLastError = true)]
|
|
|
+ private static extern bool GetCursorPos(out POINT pt);
|
|
|
+
|
|
|
+ private IntPtr _handle;
|
|
|
+
|
|
|
+ private bool initSrMain;
|
|
|
+ private int _urmwidth;
|
|
|
+ private int _urmheight;
|
|
|
+ private double lambda;
|
|
|
+ private int aviFrames;
|
|
|
+ private VinnoSR urmAnalysis;
|
|
|
+
|
|
|
+
|
|
|
+ private URMAVIParam _urmaviParam;
|
|
|
+
|
|
|
+ private double temp_ScaleOfPixel_x;
|
|
|
+ private double temp_ScaleOfPixel_y;
|
|
|
+
|
|
|
+ public double ScreenWidth = 980;
|
|
|
+ public double ScreenHeight = 650;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public URMAnalysisProcess()
|
|
|
+ {
|
|
|
+ POINT p = new POINT();
|
|
|
+ bool success = GetCursorPos(out p);
|
|
|
+ Console.WriteLine(p.ToString());
|
|
|
+ _handle = PIA_CreateURMAnalysisDataProcess();
|
|
|
+ urmAnalysis = new VinnoSR();
|
|
|
+
|
|
|
+
|
|
|
+ _urmaviParam = new URMAVIParam();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Release()
|
|
|
+ {
|
|
|
+ PIA_URMAnalysisDataProcess_Release(_handle);
|
|
|
+ }
|
|
|
+
|
|
|
+ private NativeArray srcArray;
|
|
|
+ private int SrcWidth;
|
|
|
+ private int SrcHeight;
|
|
|
+ private Dictionary<string, SRColorBarParam> srColorBarParams;
|
|
|
+ private NativeArray Densitycolormap;
|
|
|
+ private int Densitycolormaplength;
|
|
|
+
|
|
|
+
|
|
|
+ public bool URMAnalysis(string urmFold)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (urmAnalysis == null)
|
|
|
+ {
|
|
|
+ Logger.WriteLineError("SuperResolution error: SrMain, _srMain is null");
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ LoadColorBarParams();
|
|
|
+
|
|
|
+ int urmStabilizer = 0;
|
|
|
+ MWArray folder = urmFold;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ RecordNativeArray maskArray = new RecordNativeArray(0);
|
|
|
+ if (urmStabilizer < 2)
|
|
|
+ {
|
|
|
+ var MatOuts = new List<float[,]>();
|
|
|
+ var MatOutDirs = new List<float[,]>();
|
|
|
+ var MatOutVels = new List<float[,]>();
|
|
|
+ var PointList = new List<object[,]>();
|
|
|
+ initSrMain = false;
|
|
|
+ var results = (MWCellArray)urmAnalysis.SR_Main(folder);
|
|
|
+ object[,] resultArrays = (object[,])results.ToArray();
|
|
|
+ int packets = resultArrays.GetLength(1);
|
|
|
+ for (int i = 0; i < packets; i++)
|
|
|
+ {
|
|
|
+ object[,,] curresult = (object[,,])resultArrays[0, i];
|
|
|
+ float[,] curMat = (float[,])curresult[0, 0, 0];
|
|
|
+ float[,] curMatdir = (float[,])curresult[1, 0, 0];
|
|
|
+ float[,] curMatvel = (float[,])curresult[2, 0, 0];
|
|
|
+ object[,] curPoints = (object[,])curresult[7, 0, 0];
|
|
|
+ if (!initSrMain)
|
|
|
+ {
|
|
|
+ initSrMain = true;
|
|
|
+ _urmwidth = curMat.GetLength(1);
|
|
|
+ _urmheight = curMat.GetLength(0);
|
|
|
+ float[,] lambdaArray = (float[,])curresult[6, 0, 0];
|
|
|
+ lambda = (double)lambdaArray[0, 0];
|
|
|
+ aviFrames = curPoints.GetLength(1);
|
|
|
+ bool[,] maskdata = (bool[,])curresult[10, 0, 0];
|
|
|
+ double[,] Scalers = (double[,])curresult[8, 0, 0];
|
|
|
+
|
|
|
+ var res = 2.5;
|
|
|
+ var scaleofx = Scalers[0, 0] * res;
|
|
|
+ var scaleofy = Scalers[0, 1] * res;
|
|
|
+ temp_ScaleOfPixel_x = scaleofx;
|
|
|
+ temp_ScaleOfPixel_y = scaleofy;
|
|
|
+
|
|
|
+
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ maskArray.Resize(_urmwidth * _urmheight * sizeof(byte));
|
|
|
+ byte* maskArrayPtr = (byte*)maskArray.Start.ToPointer();
|
|
|
+ for (int k = 0; k < _urmheight; k++)
|
|
|
+ {
|
|
|
+ for (int j = 0; j < _urmwidth; j++)
|
|
|
+ {
|
|
|
+ var vel = maskdata[k, j];
|
|
|
+ maskArrayPtr[j + k * _urmwidth] = vel ? (byte)1 : (byte)0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ MatOuts.Add(curMat);
|
|
|
+ MatOutDirs.Add(curMatdir);
|
|
|
+ MatOutVels.Add(curMatvel);
|
|
|
+ PointList.Add(curPoints);
|
|
|
+
|
|
|
+ }
|
|
|
+ RecordNativeArray matout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
|
|
|
+ RecordNativeArray matdirout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
|
|
|
+ RecordNativeArray matvelout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
|
|
|
+ Console.WriteLine("Akio:_urmBeams is {0},_urmSamples is {1},packets is {2}", _urmwidth, _urmheight, packets);
|
|
|
+ long nativelength = (long)_urmwidth * (long)_urmheight * 4L * (long)packets;
|
|
|
+ NativeArray matOutNatveArray = new NativeArray(nativelength);
|
|
|
+ NativeArray matOutDirNatveArray = new NativeArray(nativelength);
|
|
|
+ NativeArray matOutVelNatveArray = new NativeArray(nativelength);
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ float* matOutNatveArrayPtr = (float*)matOutNatveArray.Start.ToPointer();
|
|
|
+ float* matOutDirNatveArrayPtr = (float*)matOutDirNatveArray.Start.ToPointer();
|
|
|
+ float* matOutVelNatveArrayPtr = (float*)matOutVelNatveArray.Start.ToPointer();
|
|
|
+ for (int i = 0; i < packets; i++)
|
|
|
+ {
|
|
|
+ float* curmatOutNatveArrayPtr = matOutNatveArrayPtr + (long)i * (_urmwidth * _urmheight);
|
|
|
+ float* curmatOutDirNatveArrayPtr = matOutDirNatveArrayPtr + (long)i * (_urmwidth * _urmheight);
|
|
|
+ float* curmatOutVelNatveArrayPtr = matOutVelNatveArrayPtr + (long)i * (_urmwidth * _urmheight);
|
|
|
+ float[,] MatOutArray = MatOuts[i];
|
|
|
+ float[,] MatOutDirArray = MatOutDirs[i];
|
|
|
+ float[,] MatOutVelArray = MatOutVels[i];
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ for (int k = 0; k < _urmheight; k++)
|
|
|
+ {
|
|
|
+ for (int j = 0; j < _urmwidth; j++)
|
|
|
+ {
|
|
|
+ var vel = MatOutArray[k, j];
|
|
|
+ curmatOutNatveArrayPtr[j + k * _urmwidth] = vel;
|
|
|
+ var veldir = MatOutDirArray[k, j];
|
|
|
+ curmatOutDirNatveArrayPtr[j + k * _urmwidth] = veldir;
|
|
|
+ var velvel = MatOutVelArray[k, j];
|
|
|
+ curmatOutVelNatveArrayPtr[j + k * _urmwidth] = velvel;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ MatOuts.Clear();
|
|
|
+ MatOutDirs.Clear();
|
|
|
+ MatOutVels.Clear();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ PIA_URMGetLastResultFromPackets(_handle, matOutNatveArray.Start, matOutDirNatveArray.Start, matOutVelNatveArray.Start, packets, _urmwidth,
|
|
|
+ _urmheight, matout.Start, matdirout.Start, matvelout.Start);
|
|
|
+
|
|
|
+ matOutNatveArray.Dispose();
|
|
|
+ matOutDirNatveArray.Dispose();
|
|
|
+ matOutVelNatveArray.Dispose();
|
|
|
+
|
|
|
+ SrcWidth = _urmwidth;
|
|
|
+ SrcHeight = _urmheight;
|
|
|
+ srcArray?.Dispose();
|
|
|
+ srcArray = new NativeArray(SrcWidth * SrcHeight * 8);
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ double* img = (double*)srcArray.Start.ToPointer();
|
|
|
+ double* matSrc = (double*)matout.Start.ToPointer();
|
|
|
+ for (int i = 0; i < SrcWidth * SrcHeight; i++)
|
|
|
+ {
|
|
|
+ img[i] = matSrc[i];
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ int[] PointNumList = new int[aviFrames];
|
|
|
+ List<URMPoint> pointsList = new List<URMPoint>();
|
|
|
+ for (int i = 0; i < aviFrames; i++)
|
|
|
+ {
|
|
|
+ int PointNum = 0;
|
|
|
+ for (int j = 0; j < PointList.Count; j++)
|
|
|
+ {
|
|
|
+ object[,] curpointArray = PointList[j];
|
|
|
+ if (curpointArray[0, i] is double[,])
|
|
|
+ {
|
|
|
+ double[,] CurPointsArray = (double[,])curpointArray[0, i];
|
|
|
+ var curPointsCount = CurPointsArray.GetLength(0);
|
|
|
+ PointNum += curPointsCount;
|
|
|
+ for (int k = 0; k < curPointsCount; k++)
|
|
|
+ {
|
|
|
+ URMPoint curPoint = new URMPoint();
|
|
|
+ curPoint.X = (float)CurPointsArray[k, 0];
|
|
|
+ curPoint.Y = (float)CurPointsArray[k, 1];
|
|
|
+ curPoint.vel = (float)CurPointsArray[k, 2];
|
|
|
+ pointsList.Add(curPoint);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (curpointArray[0, i] is float[,])
|
|
|
+ {
|
|
|
+ float[,] CurPointsArray = (float[,])curpointArray[0, i];
|
|
|
+ var curPointsCount = CurPointsArray.GetLength(0);
|
|
|
+ PointNum += curPointsCount;
|
|
|
+ for (int k = 0; k < curPointsCount; k++)
|
|
|
+ {
|
|
|
+ URMPoint curPoint = new URMPoint();
|
|
|
+ curPoint.X = CurPointsArray[k, 0];
|
|
|
+ curPoint.Y = CurPointsArray[k, 1];
|
|
|
+ curPoint.vel = CurPointsArray[k, 2];
|
|
|
+ pointsList.Add(curPoint);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ PointNumList[i] = PointNum;
|
|
|
+ }
|
|
|
+ var pointsarray = pointsList.ToArray();
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ var result = (MWStructArray)urmAnalysis.SR_Main(folder);
|
|
|
+ var MatOut = (MWNumericArray)result.GetField("MatOut");
|
|
|
+ var MatOut_zdir = (MWNumericArray)result.GetField("MatOut_zdir");
|
|
|
+ var MatOut_vel = (MWNumericArray)result.GetField("MatOut_vel");
|
|
|
+ var llz = (MWNumericArray)result.GetField("llz");
|
|
|
+ var llx = (MWNumericArray)result.GetField("llx");
|
|
|
+ var lambda = (MWNumericArray)result.GetField("lambda");
|
|
|
+ var Points = (MWCellArray)result.GetField("Points");
|
|
|
+ var Scalers = (MWNumericArray)result.GetField("SRscale");
|
|
|
+ double[,] scalersArray = (double[,])Scalers.ToArray();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var ROIMask = (MWLogicalArray)result.GetField("ROIMask");
|
|
|
+ double[,] lambdaArray = (double[,])lambda.ToArray();
|
|
|
+
|
|
|
+ bool[,] maskdata = (bool[,])ROIMask.ToArray();
|
|
|
+ double[,] MatOutArray = (double[,])MatOut.ToArray();
|
|
|
+ double[,] MatOutDirArray = (double[,])MatOut_zdir.ToArray();
|
|
|
+ double[,] MatOutVelArray = (double[,])MatOut_vel.ToArray();
|
|
|
+ _urmwidth = MatOutArray.GetLength(1);
|
|
|
+ _urmheight = MatOutArray.GetLength(0);
|
|
|
+ RecordNativeArray matout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
|
|
|
+ RecordNativeArray matdirout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
|
|
|
+ RecordNativeArray matvelout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
|
|
|
+ maskArray.Resize(_urmwidth * _urmheight * sizeof(byte));
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ double* matOutNatveArrayPtr = (double*)matout.Start.ToPointer();
|
|
|
+ double* matOutDirNatveArrayPtr = (double*)matdirout.Start.ToPointer();
|
|
|
+ double* matOutVelNatveArrayPtr = (double*)matvelout.Start.ToPointer();
|
|
|
+ byte* maskArrayPtr = (byte*)maskArray.Start.ToPointer();
|
|
|
+ for (int i = 0; i < _urmheight; i++)
|
|
|
+ {
|
|
|
+ for (int j = 0; j < _urmwidth; j++)
|
|
|
+ {
|
|
|
+ var vel = MatOutArray[i, j];
|
|
|
+ matOutNatveArrayPtr[j + i * _urmwidth] = vel;
|
|
|
+ var veldir = MatOutDirArray[i, j];
|
|
|
+ matOutDirNatveArrayPtr[j + i * _urmwidth] = veldir;
|
|
|
+ var velvel = MatOutVelArray[i, j];
|
|
|
+ matOutVelNatveArrayPtr[j + i * _urmwidth] = velvel;
|
|
|
+ var maskvel = maskdata[i, j];
|
|
|
+ maskArrayPtr[j + i * _urmwidth] = maskvel ? (byte)1 : (byte)0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ object[,] pointArray = (object[,])Points.ToArray();
|
|
|
+ aviFrames = Points.Dimensions[1];
|
|
|
+ List<URMPoint> pointsList = new List<URMPoint>();
|
|
|
+ int[] PointNumList = new int[aviFrames];
|
|
|
+ for (int i = 0; i < aviFrames; i++)
|
|
|
+ {
|
|
|
+
|
|
|
+ float[,] CurPointsArray = (float[,])pointArray[0, i];
|
|
|
+ var curPointsCount = CurPointsArray.GetLength(0);
|
|
|
+ for (int k = 0; k < curPointsCount; k++)
|
|
|
+ {
|
|
|
+ URMPoint curPoint = new URMPoint();
|
|
|
+ curPoint.X = CurPointsArray[k, 0];
|
|
|
+ curPoint.Y = CurPointsArray[k, 1];
|
|
|
+ curPoint.vel = CurPointsArray[k, 2];
|
|
|
+ pointsList.Add(curPoint);
|
|
|
+ }
|
|
|
+ PointNumList[i] = curPointsCount;
|
|
|
+ }
|
|
|
+ var pointsarray = pointsList.ToArray();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var DensityColorParam = srColorBarParams["Density"];
|
|
|
+ var lambda1 = lambda;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ int srcwidth = SrcWidth;
|
|
|
+ int srcheight = SrcHeight;
|
|
|
+
|
|
|
+ int dstwidthbeforeResize = (int)(srcwidth * 3 * (temp_ScaleOfPixel_y / temp_ScaleOfPixel_x) / 2.5 + 0.5);
|
|
|
+ int dstheightbeforeResiz = (int)(srcheight * temp_ScaleOfPixel_x / 2.5 + 0.5);
|
|
|
+ double widthScale = ScreenWidth / dstwidthbeforeResize;
|
|
|
+ double heightScale = ScreenHeight / dstheightbeforeResiz;
|
|
|
+ double ScanScale = widthScale < heightScale ? widthScale : heightScale;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ int dstwidth = srcwidth;
|
|
|
+ int dstheight = srcheight;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ double tempmax = 2;
|
|
|
+ double tempmin = 1;
|
|
|
+ NativeArray dstArray = new NativeArray(4 * dstwidth * dstheight);
|
|
|
+ NativeArray dstArrayu = new NativeArray(8 * dstwidth * dstheight);
|
|
|
+
|
|
|
+ GetSRColorMap(DensityColorParam.ColorMap, ref Densitycolormap, out Densitycolormaplength);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var srParams = new SrParams();
|
|
|
+ srParams.Res = 2.5;
|
|
|
+ srParams.ScaleOfPixel_x = temp_ScaleOfPixel_x;
|
|
|
+ srParams.ScaleOfPixel_y = temp_ScaleOfPixel_y;
|
|
|
+ srParams.DownsampleIndex = 1;
|
|
|
+ PIA_SetSrParam(_handle, srParams);
|
|
|
+
|
|
|
+ bool success = PIA_SRGetDensityImg(_handle, srcArray.Start, srcwidth, srcheight, dstArray.Start, dstArrayu.Start, dstwidth, dstheight, Densitycolormap.Start, Densitycolormaplength, lambda1, ref tempmax, ref tempmin, 1);
|
|
|
+ Console.WriteLine(success);
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ byte* ptr = (byte*)dstArray.Start.ToPointer();
|
|
|
+
|
|
|
+ double* img = (double*)srcArray.Start.ToPointer();
|
|
|
+
|
|
|
+ for (int i = 0; i < dstwidth * dstheight; i++)
|
|
|
+ {
|
|
|
+ Console.WriteLine(ptr[i * 4]);
|
|
|
+ Console.WriteLine(ptr[i * 4 + 1]);
|
|
|
+ Console.WriteLine(ptr[i * 4 + 2]);
|
|
|
+ Console.WriteLine(ptr[i * 4 + 3]);
|
|
|
+ if (img[i] > 0)
|
|
|
+ {
|
|
|
+ ptr[i * 4] = 0;
|
|
|
+ ptr[i * 4 + 1] = 0;
|
|
|
+ ptr[i * 4 + 2] = 180;
|
|
|
+ ptr[i * 4 + 3] = 255;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var converter = new ImageConverter();
|
|
|
+ if (converter.ConvertToImage(dstwidth, dstheight, dstArray.Start, (int)dstArray.Length, out SKBitmap bitmap))
|
|
|
+ {
|
|
|
+
|
|
|
+ using (var image = SKImage.FromBitmap(bitmap))
|
|
|
+ using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
|
|
|
+ {
|
|
|
+
|
|
|
+ var base64String = Convert.ToBase64String(data.ToArray());
|
|
|
+ Console.WriteLine(base64String);
|
|
|
+
|
|
|
+ string timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
|
|
|
+
|
|
|
+
|
|
|
+ string resolution = $"{dstwidth}x{dstheight}";
|
|
|
+
|
|
|
+
|
|
|
+ string fileName = $"output_{timeStamp}_{resolution}.png";
|
|
|
+ using (var stream = System.IO.File.OpenWrite(fileName))
|
|
|
+ {
|
|
|
+ data.SaveTo(stream);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ bitmap.Dispose();
|
|
|
+ }
|
|
|
+ dstArray.Dispose();
|
|
|
+ dstArrayu.Dispose();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private void GetSRColorMap(string colorMap, ref NativeArray colorMapArray, out int talbelength)
|
|
|
+ {
|
|
|
+ colorMapArray?.Dispose();
|
|
|
+ var talbelengthlist = new List<int>();
|
|
|
+ var rValue = new List<int> { 0, 5, 8, 11, 13, 16, 19, 21, 24, 27, 29, 32, 35, 37, 40, 43, 45, 48, 50, 53, 56, 58, 61, 64, 66, 69, 72, 74, 77, 80, 82, 85, 88, 90, 93, 96, 98, 101, 104, 106, 109, 112, 114, 117, 120, 122, 125, 128, 130, 133, 135, 138, 141, 143, 146, 149, 151, 154, 157, 159, 162, 165, 167, 170, 173, 175, 178, 181, 183, 186, 189, 191, 194, 197, 199, 202, 205, 207, 210, 213, 215, 218, 220, 223, 226, 228, 231, 234, 236, 239, 242, 244, 247, 250, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };
|
|
|
+ var gValue = new List<int> { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 8, 11, 13, 16, 19, 21, 24, 27, 29, 32, 35, 37, 40, 43, 45, 48, 50, 53, 56, 58, 61, 64, 66, 69, 72, 74, 77, 80, 82, 85, 88, 90, 93, 96, 98, 101, 104, 106, 109, 112, 114, 117, 120, 122, 125, 128, 130, 133, 135, 138, 141, 143, 146, 149, 151, 154, 157, 159, 162, 165, 167, 170, 173, 175, 178, 181, 183, 186, 189, 191, 194, 197, 199, 202, 205, 207, 210, 213, 215, 218, 220, 223, 226, 228, 231, 234, 236, 239, 242, 244, 247, 250, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };
|
|
|
+ var bValue = new List<int> { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100, 104, 108, 112, 116, 120, 124, 128, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255 };
|
|
|
+ var result = true;
|
|
|
+
|
|
|
+
|
|
|
+ talbelength = 256;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ colorMapArray = new NativeArray(talbelength * 4);
|
|
|
+ if (result)
|
|
|
+ {
|
|
|
+
|
|
|
+ unsafe
|
|
|
+ {
|
|
|
+ byte* colormapptr = (byte*)colorMapArray.Start.ToPointer();
|
|
|
+ for (int i = 0; i < talbelength; i++)
|
|
|
+ {
|
|
|
+ colormapptr[4 * i] = (byte)bValue[i];
|
|
|
+ colormapptr[4 * i + 1] = (byte)gValue[i];
|
|
|
+ colormapptr[4 * i + 2] = (byte)rValue[i];
|
|
|
+ colormapptr[4 * i + 3] = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void LoadColorBarParams()
|
|
|
+ {
|
|
|
+ srColorBarParams = new Dictionary<string, SRColorBarParam>();
|
|
|
+
|
|
|
+ var colorConfigs = "[\"Density SRColorMap:ColorMap1\" \"Direction SRColorMap:ColorMap2\" \"Vel SRColorMap:ColorMap3\" \"SRAvi SRColorMap:ColorMap4\"]";
|
|
|
+ if (!string.IsNullOrEmpty(colorConfigs))
|
|
|
+ {
|
|
|
+ EnumMeta enumMeta = ParamMetaSection.CreateMeta(colorConfigs) as EnumMeta;
|
|
|
+ if (enumMeta?.Values.Length > 0)
|
|
|
+ {
|
|
|
+ foreach (var config in enumMeta.Values)
|
|
|
+ {
|
|
|
+ SRColorBarParam curBarParam = new SRColorBarParam();
|
|
|
+ var elements = config.Split(' ');
|
|
|
+ if (elements.Length == 2)
|
|
|
+ {
|
|
|
+ var title = elements[0].Trim();
|
|
|
+ var mapConfigs = elements[1].Trim();
|
|
|
+ curBarParam.ColorMap = mapConfigs;
|
|
|
+ srColorBarParams.Add(title, curBarParam);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void TransposeImg(IntPtr imgPtr, int beams, int samples)
|
|
|
+ {
|
|
|
+ PIA_TransposeImg(_handle, imgPtr, beams, samples);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+public enum UrmImageType
|
|
|
+{
|
|
|
+ Unknown,
|
|
|
+ Raw,
|
|
|
+ Den,
|
|
|
+ Dir,
|
|
|
+ Vel
|
|
|
+}
|
|
|
+
|
|
|
+public class SrParams
|
|
|
+{
|
|
|
+
|
|
|
+ public double ScaleOfPixel_x { get; set; }
|
|
|
+ public double ScaleOfPixel_y { get; set; }
|
|
|
+ public double Res { get; set; }
|
|
|
+ public double DownsampleIndex { get; set; }
|
|
|
+ public double DownsampleIndexVideo { get; set; }
|
|
|
+ public double VideoNorIndex { get; set; }
|
|
|
+ public double IntPowerDen { get; set; }
|
|
|
+ public double IntPowerDir { get; set; }
|
|
|
+ public double SigmaGauss { get; set; }
|
|
|
+ public double VessScale { get; set; }
|
|
|
+ public double VelMaxValue { get; set; }
|
|
|
+ public double VelMinValue { get; set; }
|
|
|
+ public uint UrmLevel { get; set; }
|
|
|
+ public uint VideoParameter { get; set; }
|
|
|
+ public uint CaptureFrames { get; set; }
|
|
|
+ public float FrequencyMin { get; set; }
|
|
|
+ public string FrequencyMinUnit { get; set; }
|
|
|
+ public float FrameRateDisplay { get; set; }
|
|
|
+ public string FrameRateDisplayUnit { get; set; }
|
|
|
+
|
|
|
+ public uint VSpeckle { get; set; }
|
|
|
+ public uint Moco { get; set; }
|
|
|
+ public UrmImageType ImageType { get; set; }
|
|
|
+
|
|
|
+ public SrParams()
|
|
|
+ {
|
|
|
+ ScaleOfPixel_x = 1;
|
|
|
+ ScaleOfPixel_y = 1;
|
|
|
+ Res = 10;
|
|
|
+ DownsampleIndex = 3.0;
|
|
|
+ DownsampleIndexVideo = 1.5;
|
|
|
+ VideoNorIndex = 2;
|
|
|
+ IntPowerDen = 0.33;
|
|
|
+ IntPowerDir = 0.25;
|
|
|
+ SigmaGauss = 1.0;
|
|
|
+ VessScale = 0.2;
|
|
|
+ UrmLevel = 2;
|
|
|
+ VideoParameter = 2;
|
|
|
+ VelMaxValue = 1;
|
|
|
+ VelMinValue = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+public class ImageConverter
|
|
|
+{
|
|
|
+ public bool ConvertToImage(int dstWidth, int dstHeight, IntPtr tempArray, int tempArrayLength, out SKBitmap bitmap)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (tempArray == IntPtr.Zero || tempArrayLength <= 0)
|
|
|
+ {
|
|
|
+ bitmap = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var info = new SKImageInfo(dstWidth, dstHeight, SKColorType.Bgra8888, SKAlphaType.Premul);
|
|
|
+
|
|
|
+
|
|
|
+ bitmap = new SKBitmap(info);
|
|
|
+
|
|
|
+
|
|
|
+ bool success = bitmap.InstallPixels(info, tempArray, info.RowBytes, (addr, ctx) =>
|
|
|
+ {
|
|
|
+
|
|
|
+ }, null);
|
|
|
+
|
|
|
+ return success;
|
|
|
+ }
|
|
|
+}
|