C# 巴斯勒相机图像OpenCV3

C# 巴斯勒相机图像OpenCV3,c#,opencvsharp,C#,Opencvsharp,我想用巴斯勒相机在C#中的WinForm上放一个图片盒。 但是我想把图像转换成Mat。因为我想用垫子把它插入图片盒 请告诉我您的提示或解决方案 PixelDataConverter converter = new PixelDataConverter(); public Form1() { InitializeComponent(); using (Camera camera = new Camera()) { c

我想用巴斯勒相机在C#中的WinForm上放一个图片盒。 但是我想把图像转换成Mat。因为我想用垫子把它插入图片盒

请告诉我您的提示或解决方案

PixelDataConverter converter = new PixelDataConverter();

    public Form1() {
        InitializeComponent();
        using (Camera camera = new Camera())
        {
            camera.CameraOpened += Configuration.AcquireContinuous;

            camera.Open();
            camera.Parameters[PLCameraInstance.MaxNumBuffer].SetValue(5);
            camera.StreamGrabber.Start();

            IGrabResult grabResult = camera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException);

            using (grabResult)
            {
                if (grabResult.GrabSucceeded) {
                    Mat rtnMat = convertToMat(grabResult);                       
                    Cv2.ImShow("test", rtnMat);
                    pictureBox1.Image = BitmapConverter.ToBitmap(frame);
                }
            }

            camera.StreamGrabber.Stop();
            camera.Close();
        }
    }

    private Mat convertToMat(IGrabResult rtnGrabResult) {
        IImage image = rtnGrabResult;
        converter.OutputPixelFormat = PixelType.BGR8packed;
        byte[] buffer = image.PixelData as byte[];
        return new Mat(rtnGrabResult.Width, rtnGrabResult.Height, MatType.CV_8UC1, buffer);
    }
巴士勒图片:

OpenCvSharp图像:


以下是将IGrabResult转换为OpenCvSharp.Mat的正确方法。 我没有在没有转换器的情况下尝试,但您的主要问题是新Mat(..)参数的顺序。在OpenCV中,首先声明行,然后声明列。这意味着首先是高度,然后是宽度。而且彩色图像的MatType也是错误的,如@Nyerguds所说。它必须是CV_8UC3

更正代码:

private Mat convertToMat(IGrabResult rtnGrabResult) {
        converter.OutputPixelFormat = PixelType.BGR8packed;
        byte[] buffer = new byte[conv.GetBufferSizeForConversion(rtnGrabResult];
        converter.Convert(buffer, rtnGrabResult);
        return new Mat(rtnGrabResult.Height, rtnGrabResult.Width, MatType.CV_8UC3, buffer);
}

所以实际问题是什么?代码不起作用吗?Basler图像是所需的图像。但它看起来像OpenCvSharp图像。这对我来说似乎是一个步幅问题。。。您应该能够以某种方式从该数据中获得跨步()。如果你不能给Mat构造器一个跨步,你可能需要压缩字节数据来去除任何填充。不过,这不仅仅是跨步。。。那里的图像明显增加了三倍。从规格来看,
CV_8UC1
表示8位单通道阵列(灰度),而
BGR8packed
表示24位RGB,因此显然不匹配。另外,您有这个
PixelDataConverter
对象,但实际上似乎并没有在任何地方使用它。您确定这是从相机返回的RGB图像吗?对我来说,它看起来像灰度图像,因此PixelType.BGR8packed不正确,因此您看到的是三重图像,而不是彩色图像。