c++ - OpenCV:矩阵元素访问

标签 c++ opencv

我正在使用 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/

相关文章:

c++ - 如何拥有 "constexpr and runtime"别名

c++ - int &f = d 是什么意思

opencv - 如何在 OpenCV 中获得最相似的 Eigenfaces 或 Fisherfaces?

c++ - 带有 OpenCV 的 Qt Creator 中的错误代码 0xc0000135

c++ - 无效使用不完整类型 'class …' STL vector

c++ - 如果没有类重新实现 'virtual' 关键字是否可以优化掉?

c++ - #define hell C/C++ 的替代品/工具

android - 如何将 OpenCV Mat 作为 putExtra 发送到 Android Intent?

opencv - Blob 检测 OpenCV

c++ - 在 OpenCV 中使用 Mat 时的 exc_bad_access 虽然看起来我的索引是正确的