矩阵元素访问

OpenCV: Matrix element access

本文关键字:访问 元素      更新时间:2023-10-16

我使用OpenCV 3.0从文件中加载图像,然后将该数据存储在数组中。

如果我使用:

cv::Mat image = cv::imread("myimage.png");
uchar pixel = image.at<uchar>(50, 100);

它会给出图像坐标(x = 100, y = 50)处的像素值

但是,如果我现在将图像内存复制到数组中:

uchar data[image.rows * image.cols];
memcpy(data, image.data, image.rows * image.cols);

然后从这个数组中读取像素值:

uchar pixel = data[100 * image.cols + 50];

那么它给出的值就和之前的不一样了

我想知道为什么会这样?是因为OpenCV不以这种方式将其内存存储为单个数组吗?如果是这样,我如何将内存复制到数组,然后直接从该数组访问像素值?

谢谢:)

这是因为OpenCV使用了padding。
每行可能包含额外的字节以确保更好的对齐。

复制你的数据,如果你想它没有填充:

for ( int i=0; i<image.rows; ++i )
  memcpy( &data[i*100], image.data + image.step*i, 50);

同样,数据按水平线(行)排列。所以你应该这样访问它:

image.at<uchar>(Y,X).  
uchar pixel = data[Y*image.cols + X];

或者你可以复制它,包括padding:

memcpy( data, image.data, image.step*image.rows);

然后你必须使用大小为image的行来访问它。步骤(可以等于或大于image.cols)。

uchar pixel = data[Y*image.step + X];