C#Emgu.Cv包装器:Mat的检索(字节)像素值与Image 裁剪ROI时的字节值]不匹配

问题描述 投票:1回答:1

((我使用Emgu.Cv版本4.2.0.3662)

让我们通过裁剪宽度= w和高度= h的小ROI来考虑图像对象的以下构造:

Image<Gray, byte> img = new Image<Gray, byte>(@"D:\temp\tst_img.JPG");
Mat mat = img.Copy().Mat;
var roi = new Rectangle(0, 0, w, h);
img.ROI = roi;
var tst_img = img.Copy();
var tst_mat = new Mat(mat, roi);

(图像文件的w可被4整除。)为了获得tst_img的字节值,我可以使用tst_img.Data(它是一个byte [,, 1]数组)或tst_img.Bytes(它对应于图像像素值作为byte []数组)。

为了获得tst_mat对应的图像的字节值,我首先尝试了tst_mat.GetData()(可以将其标识为byte [,]数组)。 我注意到tst_mat.GetData()字节数组的值与tst_img.Data值不匹配,但是它们的尺寸确实匹配(忽略后者的额外1-dim通道)。但是,以下方法给出了期望值:

tst_mat.ToImage<Gray, byte>().Bytes 

我试图遵循实施Marshal.Copy的一些想法,如https://bugsdb.com/_en/debug/0cad34a2bab07405564a5f09bc14ccf7所以我在MatExtension中准备了以下属性

public static byte[] MatData(this Mat mat)
{
        int w = mat.Width;
        int h = mat.Height;
        int l = w * h;
        byte[] output = new byte[l];
        Marshal.Copy(mat.DataPointer, output, 0, l);
        return output;
}

但是,tst_mat.MatData()不能产生与tst_img.Bytes相同的字节值。我怀疑这种方法提供的值与tst_img.bytes不匹配,因为它没有考虑原始垫的宽度/跨度(从中裁剪出tst_mat)。

这里提供一个明确的测试示例,使用大小为4 * 2(宽*高)的roi进行演示:

the test image

我比较以下变量的字节值:

byte[,,] img_bytes_dat = img_roi.Data;
byte[,] mat_bytes_dat = (byte[,]) mat_roi.GetData();
byte[] img_bytes_arr = img_roi.Bytes;
byte[] mat_bytes_arr = mat_roi.MatData();
byte[] mat2img_bytes_arr = mat_roi.ToImage<Gray, byte>().Bytes;

查看img_bytes_dat(或其扁平版本img_bytes_arr),我得到以下像素值:

[0,0,0] 126

[0,1,0] 126

[[0,2,0] 131

[0,3,0] 146

[1,0,0] 125

[1,1,0] 124

[1、2、0] 130

[1、3、0] 145

和mat2img_bytes_arr包含这些像素值)。看着mat_bytes_dat(mat_bytes_arr具有相同的像素值),我得到以下像素值:

[0,0] 126

[0,1] 126

[0,2] 131

[0,3] 146

[1,0] 154

[1,1] 156

[1,2] 157

[1,3] 153

这是ROI的宽度,它确定这些数组不匹配的索引。

考虑到上述情况,当我们将Mat.GetData()方法应用于通过裁剪不同Mat对象的ROI构建的Mat对象时,我对它的含义感到非常困惑。所得阵列实际上具有ROI的尺寸,但数据与预期的不匹配。

将“ tst_mat”的所有像素值作为单个数组获取的正确和最有效的方法是什么(我不介意1d或多维)?(没有“ mat2img_bytes_arr”的2个阶段的路由)

c# emgucv mat
1个回答
1
投票

首先,您的努力和测试做得不错。我能够重新创建完全相同的行为,并将其视为错误。我鼓励您将其报告给Emgu Forum,希望可以得到更好的支持。

© www.soinside.com 2019 - 2024. All rights reserved.