2015-08-19 199 views
2

我使用OpenCV 3.0從文件加載圖像,然後將數據存儲在數組中。OpenCV:矩陣元素訪問

如果我使用:

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

它會給我在的像素值(X = 100,Y = 50)的圖像座標。

但是,如果我現在圖像存儲器複製到一個數組:

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

然後,它不給我相同的值:

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

,然後從該陣列讀取像素值像之前一樣。

我想知道這是爲什麼?是否因爲OpenCV不以這種方式將其內存作爲單個陣列存儲?如果是這樣,我怎麼能將內存複製到一個數組,然後直接從這個數組訪問像素值?

謝謝:)

+0

這是因爲數據對齊正在存儲第一行,然後是secpnd行。 .at(50,100)表示col = 100,row = 50,因此您必須訪問數據[50 * image.cols + 100]。如果矩陣不連續,請參閱jose antonios的答案。啊...他也提到了x/y排序:D – Micka

回答

3

這是因爲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]; 
+0

是的,如果以後你使用image.step來訪問它。不,如果你想要數據沒有填充和訪問image.cols,我假設這是什麼需要在這裏。 –