我正在使用 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 使用填充。
每行可能包含额外的字节以确保更好的对齐。
如果您想要不带填充的数据,请以这种方式复制数据。:
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];
或者如果包含填充,您可以复制:
memcpy( data, image.data, image.step*image.rows);
然后您必须使用 image.step 大小的行(可能等于或大于 image.cols)来访问它。
uchar pixel = data[Y*image.step + X];
关于c++ - OpenCV:矩阵元素访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105802/