OpenCV:矩阵元素访问

Posted

技术标签:

【中文标题】OpenCV:矩阵元素访问【英文标题】:OpenCV: Matrix element access 【发布时间】:2015-08-19 21:16:44 【问题描述】:

我正在使用 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 没有以这种方式将其内存存储为单个数组?如果是这样,我如何将内存复制到数组中,然后直接从该数组中访问像素值?

谢谢:)

【问题讨论】:

那是因为数据对齐是存储第一行,然后是第二行。 .at (50,100) 表示 col=100 和 row=50,因此您必须访问数据 [50*image.cols + 100]。如果矩阵不连续,请参阅 jose antonios 答案。啊...他也提到了 x/y 排序:D 【参考方案1】:

那是因为 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];

【讨论】:

是的,如果稍后您使用 image.step 访问它。如果您想要没有填充的数据并使用 image.cols 访问它,我假设这是这里需要的。

以上是关于OpenCV:矩阵元素访问的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCV 中访问高维矩阵的元素?

访问opencv矩阵CV_32S元素

opencv怎么给mat赋值

如何像矩阵元素一样访问opencv中的vector<vector<Point>>轮廓?

02OpenCV数据载入显示与保存

opencv多通道元素访问