欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > Halcon:HObject与opencv:Mat互转

Halcon:HObject与opencv:Mat互转

2025/4/19 8:44:01 来源:https://blog.csdn.net/weixin_38566632/article/details/146078973  浏览:    关键词:Halcon:HObject与opencv:Mat互转

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); // 转换为 RGB 格式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++){//long step = pImage.Step();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;}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词