C++ OpenCV:矩阵元素访问

C++ OpenCV:矩阵元素访问,c++,opencv,C++,Opencv,我正在使用OpenCV 3.0从文件中加载一个图像,然后将该数据存储在一个数组中 如果我使用: cv::Mat image = cv::imread("myimage.png"); uchar pixel = image.at<uchar>(50, 100); 然后从该数组中读取像素值: uchar pixel = data[100 * image.cols + 50]; 那么它就不会给我和以前一样的值 我想知道为什么会这样?是因为OpenCV不以这种方式将其内存存储为单个数组吗

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

如果我使用:

cv::Mat image = cv::imread("myimage.png");
uchar pixel = image.at<uchar>(50, 100);
然后从该数组中读取像素值:

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.step(可能等于或大于image.cols)的行来访问它


是,如果以后使用image.step访问它。如果您希望数据不带填充并使用image.cols访问它,则不需要。我假设这里需要image.cols。这是因为数据对齐将存储第一行,然后是secpnd行。at(50100)表示列=100,行=50,因此必须访问数据[50*image.cols+100]。如果矩阵不是连续的,请参见jose antonios的答案。啊。。。他还提到了x/y订购:D
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);
uchar pixel = data[Y*image.step + X];