Halcon学习——HObject转OpenCVSharp Mat

HObject转成Bitmap类型时,经测试转换速度非常慢,因此可以拐个弯,先转成Mat,再从Mat转成Bitmap。

上代码:

public static Mat HImageToMat(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;
            }

        }

其中会用到CopyMemory这个函数,需要在方法前声明:

[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);

 

`HImage` 是 HDevelop (Halcon) 中用于表示图像数据的数据类型,它主要用于处理、分析及显示图像信息。在 C# 环境下,Halcon 的图像处理功能通过 HALCON for .NET 库(通常称为 `hdevcpp` 或 `HALCON .NET API`)来提供。 而 OpenCVSharp 是一种基于 OpenCV(开源计算机视觉库)的 C# 接口,允许在 C# 应用程序中利用 OpenCV 提供的各种图像和视频处理功能。因此,在将 HDevelop 中处理后的图像换为 OpenCVSharp 可使用的格式(即 OpenCV 的 MAT 类型),你可以遵循以下几个步骤: ### 步骤 1: 获取 HImage 对象 首先假设你在 HDevelop 中已经有一个图像处理流程,并获得了最终结果的一个 `HImage` 实例。为了从这个 `HImage` 开始操作,你需要确保你正在运行的是支持 `.NET API` 的版本并正确链接到你的 C# 项目。 ### 步骤 2: 使用 HALCON to OpenCV 桥接 通常,直接从 HALCON 的 `HImage` 到 OpenCV 的换需要一些自定义的代码,因为 HALCON 和 OpenCV 使用不同的数据结构来存储图像数据。在换过程中,你需要关注图像的尺寸、通道数以及像素类型等属性。 ```csharp using HalConAPI; using OpenCvSharp; // 假设 youHImage 已经是一个有效的 HALCON 图像对象 HalCon.HImage youHImage = ...; // 这里应填充获取 HImage 的实际代码 // 创建一个与 HALCON 图像尺寸相同的 Mat 并设置相应属性 Mat opencvMat = new Mat(youHImage.Width(), youHImage.Height()); opencvMat.Cols = youHImage.Width(); opencvMat.Rows = youHImage.Height(); // 将 HALCON 的图像数据换为 OpenCV 可识别的格式 switch (youHImage.PixType()) { case PixType.BW8: // 对于二值图像(例如 BW8) for (int y = 0; y < youHImage.Height(); y++) { byte[] hImageData = new byte[youHImage.Width()]; youHImage.GetColumnData((byte*)hImageData); for (int x = 0; x < youHImage.Width(); x++) { int pixelIndex = (y * youHImage.Stride()) + x; opencvMat.Set(x, y, hImageData[pixelIndex] == 255 ? 255 : 0); } } break; case PixType.Gray8: // 对于灰度图像(例如 Gray8) for (int y = 0; y < youHImage.Height(); y++) { byte[] hImageData = new byte[youHImage.Width()]; youHImage.GetColumnData((byte*)hImageData); for (int x = 0; x < youHImage.Width(); x++) { int pixelIndex = (y * youHImage.Stride()) + x; double value = hImageData[pixelIndex]; opencvMat.Set(x, y, Math.Min(Math.Max(value / 255.0, 0), 1)); } } break; // 根据需要添加更多情况处理其他类型的图像... } ``` ### 相关问题: 1. 在什么情况下应该优先选择使用 HDevelop 进行图像处理而不是 OpenCV? 2. 如何优化上述代码片段以提高性能或减少内存消耗? 3. 在进行图像换时,如何保证颜色空间的一致性,特别是在涉及到 RGB 和灰度图像之间换时?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值