Halcon:HObject与opencv:Mat互转
- 1. Mat转HObject
- 2. HObject转Mat
1. Mat转HObject
void MatToHObject(Mat mat, out HObject hObj){int width = mat.Width;int height = mat.Height;HTuple type, pointer, widthTuple, heightTuple;if (mat.Channels() == 1){type = "byte";pointer = new HTuple(mat.Data);widthTuple = width;heightTuple = height;HOperatorSet.GenImage1(out hObj, type, width, height, pointer);}else if (mat.Channels() == 3){Mat rgb = new Mat();Cv2.CvtColor(mat, rgb, ColorConversionCodes.BGR2RGB); HTuple redPointer = new HTuple(rgb.Data);HTuple greenPointer = new HTuple(rgb.Data + 1);HTuple bluePointer = new HTuple(rgb.Data + 2);widthTuple = width;heightTuple = height;HOperatorSet.GenImageInterleaved(out hObj, redPointer, greenPointer, bluePointer, "rgb", width, height, 8, "byte", 0, 0, -1, 0);}else{hObj = new HObject();}}
2. HObject转Mat
[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);[DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]public static extern void CopyMemory(int dest, int src, int count);public static Mat HObjectToMat(HObject hobj){try{Mat pImage;HTuple htChannels;HTuple cType = null;HTuple width, height;width = height = 0;htChannels = null;HOperatorSet.CountChannels(hobj, out htChannels);if (htChannels.Length == 0){return null;}if (htChannels[0].I == 1){HTuple ptr;HOperatorSet.GetImagePointer1(hobj, out ptr, out cType, out width, out height);pImage = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1, new Scalar(0));int Width = width;unsafe{for (int i = 0; i < height; i++){IntPtr start = IntPtr.Add(pImage.Data, i * width);CopyMemory(start, new IntPtr((byte*)ptr.IP + width * i), (uint)width);}}return pImage;}else if (htChannels[0].I == 3){HTuple ptrRed;HTuple ptrGreen;HTuple ptrBlue;HOperatorSet.GetImagePointer3(hobj, out ptrRed, out ptrGreen, out ptrBlue, out cType, out width, out height);Mat pImageRed = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1);Mat pImageGreen = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1);Mat pImageBlue = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC1);pImage = new Mat(new OpenCvSharp.Size(width, height), MatType.CV_8UC3, new Scalar(0, 0, 0));unsafe{for (int i = 0; i < height; i++){long step = pImage.Step();IntPtr startRed = IntPtr.Add(pImageRed.Data, i * width);IntPtr startGreen = IntPtr.Add(pImageGreen.Data, i * width);IntPtr startBlue = IntPtr.Add(pImageBlue.Data, i * width);CopyMemory(startRed, new IntPtr((byte*)ptrRed.IP + width * i), (uint)width);CopyMemory(startGreen, new IntPtr((byte*)ptrGreen.IP + width * i), (uint)width);CopyMemory(startBlue, new IntPtr((byte*)ptrBlue.IP + width * i), (uint)width);}}Mat[] multi = new Mat[] { pImageBlue, pImageGreen, pImageRed };Cv2.Merge(multi, pImage);pImageRed.Dispose();pImageGreen.Dispose();pImageBlue.Dispose();return pImage;}else{return null;}}catch (Exception ex){throw ex;}}