C# .Net Emgu.CV 不一致地向自身传输字节

C# .Net Emgu.CV is inconsistently transferring bytes to itself

我正在使用 Emgu.CV 进行模板匹配并保存图像。 不幸的是,我 运行 遇到了一个问题,我已经有一个星期无法解决了。

问题是 我将字节数组和大小从原始图像序列化为 json 文件,每当我尝试将其转换回来时,图像有时会失真。 我已经尝试跳过序列化过程,但它仍然变得扭曲。 这是转换过程的代码:

            Image<Bgr565, byte> screenCrop = SnipMaker.takeSnip();//method creates screenshot at this point when i display the images they are 100% correct

            byte[] data = screenCrop.Bytes;//I would get normaly all this from json file(in this case im skipping over it)

            Mat mat = new Mat(screenCrop.Rows, screenCrop.Cols, screenCrop.Mat.Depth, asset.NumberOfChannels);

            Marshal.Copy(data, 0, mat.DataPointer, screenCrop.asset.Cols * screenCrop.asset.Rows * asset.NumberOfChannels);

            Image<Bgr565, byte> img = mat.ToImage<Bgr565, byte>();//This image is suddenly distorted

问题是,这个结果取决于“我不确定是什么”是最好的图像还是错误的图像:

normal result

same code different result

它几乎就像它有时落后 1 个像素,但唯一改变的是屏幕截图的大小和维度。 我试过直接的方法,比如

Image<Bgr, byte> img = new Image<Bgr, byte>(width, height);
img.Bytes = data;//data is byte array that i got from file

这有时也会给出正确的图片,但有时它会抛出异常(在尝试将字节从数据复制到 img 时 运行ge 异常 marshal.cs)

目前我唯一怀疑的是我在截屏时做错了什么但我不确定是什么:

public static Image<Bgr565, byte> Snip()
    {
        int screenWidth = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
        int screenHeight = (int)System.Windows.SystemParameters.PrimaryScreenHeight;
        using (Bitmap bmp = new Bitmap(screenWidth, screenHeight))
        {
            using (Graphics gr = Graphics.FromImage(bmp))
                gr.CopyFromScreen(0, 0, 0, 0, bmp.Size);

            using (var snipper = new SnippingTool(bmp))
            {
                if (snipper.ShowDialog() == true)
                {
                    Bitmap bitmapImage = new Bitmap(snipper.Image);

                    Rectangle rectangle = new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height);//System.Drawing
                    BitmapData bmpData = bitmapImage.LockBits(rectangle, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);//System.Drawing.Imaging

                    Image<Bgr565, byte> outputImage = new Image<Bgr565, byte>(bitmapImage.Width, bitmapImage.Height, bmpData.Stride, bmpData.Scan0);

                    bitmapImage.Dispose();
                    snipper.Close();
                    return outputImage;
                }
            }
            return null;
        }
    }

到目前为止我还没有能够解决这个问题并且知道我的运气没有人会在这里回答我。但是有人可以帮我吗? 提前谢谢你

非常感谢大家的帮助。

问题确实在屏幕截图脚本中。我使用了不正确的组合 导致位传输不一致的像素格式。 但是因为Image.Mat中的step属性是根据图片的宽度计算的(Emgucv SC):

step = sizeof(byte) * s.Width * channels;

导致有的图片正常,有的不正常(根据观察推测)

修复: 将所有 Image 更改为 Image 使其成为 32 位,然后更改:

BitmapData bmpData = bitmapImage.LockBits(rectangle, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

至:

BitmapData bmpData = bitmapImage.LockBits(rectangle, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

希望这对以后的人有所帮助。 :)