public static extern ExceptionStatus core_FileStorage_shift_Vec2b(IntPtr fs, Vec2b val);
public static extern void core_Mat_push_back_Vec2b(IntPtr self, Vec2b v);
public static extern ExceptionStatus core_FileNode_read_Vec2b(IntPtr node, out Vec2b returnValue);
public static vtkImageData OCVFPSuppression(vtkImageData BCI, vtkImageData sample, int axis = 0, double BC_threshold = 0.7 * 255.0, double sample_threshold = 80) { //Get dimensions int[] dims = BCI.GetExtent(); //Get byte data from input samples byte[] BCIByte = DataTypes.vtkToByte(BCI); byte[] SampleByte = DataTypes.vtkToByte(sample); //Output byte array byte[,,] OutByte = new byte[(dims[1] - dims[0] + 1), (dims[3] - dims[2] + 1), (dims[5] - dims[4] + 1)]; //Loop parameters int start = 0; int stop = 0; int h = 0; int w = 0; int strideh = 0; int stridew = 0; int pos = 0; if (axis == 0) { start = dims[0]; stop = dims[1] + 1; h = dims[5] + 1; w = dims[3] + 1; strideh = (dims[1] + 1) * (dims[3] + 1); stridew = 1; } if (axis == 1) { start = dims[2]; stop = dims[3] + 1; h = dims[5] + 1; w = dims[1] + 1; strideh = (dims[1] + 1) * (dims[3] + 1); stridew = (dims[3] + 1); } if (axis == 2) { start = dims[4]; stop = dims[5] + 1; h = dims[1] + 1; w = dims[3] + 1; strideh = dims[3] + 1; stridew = 1; } //Iterate over samples in parallel Parallel.For(start, stop, (int k) => { //Get slices to OpenCV matrices Mat BCMat = new Mat(h, w, MatType.CV_8UC1); var BCIndexer = BCMat.GetGenericIndexer <Vec2b>(); Mat SampleMat = new Mat(h, w, MatType.CV_8UC1); var SampleIndexer = SampleMat.GetGenericIndexer <Vec2b>(); //Iterate over indices Parallel.For(0, h, (int kh) => { Parallel.For(0, w, (int kw) => { //Current slice index if (axis == 0) { pos = k * (dims[1] + 1); } ; if (axis == 1) { pos = k; } ; if (axis == 2) { pos = k * (dims[1] + 1) * (dims[3] + 1); } ; //Current index int cur = pos + kh * strideh + kw * stridew; //Get values Vec2b bcval = BCIndexer[kh, kw]; bcval.Item0 = BCIByte[cur]; bcval.Item1 = BCIByte[cur]; Vec2b sampleval = SampleIndexer[kh, kw]; sampleval.Item0 = SampleByte[cur]; sampleval.Item1 = SampleByte[cur]; //Update matrices BCIndexer[kh, kw] = bcval; SampleIndexer[kh, kw] = sampleval; }); }); if (k == 500) { using (var window = new Window("BCMat", image: BCMat, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } using (var window = new Window("Sample", image: SampleMat, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Get binary masks Mat BCBW = BCMat.Threshold(BC_threshold, 255.0, ThresholdTypes.Binary); Mat SampleBW = SampleMat.Threshold(sample_threshold, 255.0, ThresholdTypes.Binary); if (k == 500) { using (var window = new Window("BCMat", image: BCBW, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } using (var window = new Window("Sample", image: SampleBW, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Subtract BCI mask from sample mask Mat D = SampleBW - BCBW; if (k == 500) { using (var window = new Window("D", image: D, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Closing //Generate structuring element InputArray element = InputArray.Create(new Mat(1, 50, MatType.CV_8UC1)); D = D.Dilate(element); D = D.Erode(element); if (k == 500) { using (var window = new Window("D", image: D, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Subtract closed mask from BCI mask BCBW = BCBW - D; if (k == 500) { using (var window = new Window("Cleaned BC", image: BCBW, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Dilate BCBW = BCBW.Dilate(element); if (k == 500) { using (var window = new Window("Dilated BC", image: BCBW, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Multiply BCI matrix with the mask BCMat = BCMat.Mul(BCBW); BCIndexer = BCMat.GetGenericIndexer <Vec2b>(); if (k == 500) { using (var window = new Window("Dilated BC", image: BCBW, flags: WindowMode.AutoSize)) { Cv2.WaitKey(); } } //Return the elements to output byte array Parallel.For(0, h, (int kh) => { Parallel.For(0, w, (int kw) => { //Get value Vec2b bcval = BCIndexer[kh, kw]; //Update outputarray if (axis == 0 && bcval.Item0 > BC_threshold) { OutByte[kh, k, kw] = 255; } ; if (axis == 1 && bcval.Item0 > BC_threshold) { OutByte[kh, kw, k] = 255; } ; if (axis == 2 && bcval.Item0 > BC_threshold) { OutByte[k, kh, kw] = 255; } ; }); }); }); //Convert outputarray to VTK data return(DataTypes.byteToVTK(OutByte)); }