2009-12-04 48 views

回答

44

在文檔:

http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat

它說:

(...)如果你知道矩陣元素 類型,例如它是浮動,那麼你可以在< 使用>()方法

也就是說,你可以使用:

Mat M(100, 100, CV_64F); 
cout << M.at<double>(0,0); 

也許是更容易使用Mat_類。它是Mat的模板包裝。 Mat_已重載operator()以訪問元素。

+0

圖片如何設置一個特定的值M的一些特定的指數? – damned 2011-11-05 19:54:53

+4

@sumit at <>()方法返回對元素的引用。您可以使用: M.at (0,0)= value; – 2011-11-07 13:58:22

+1

我很確定這個答案的例子是有缺陷的。我相信在內部不安全,因此在uint矩陣上使用double會產生不希望的/損壞的結果。建議更正。 – Catskul 2011-12-16 20:04:44

1

OCV竭盡全力確保在不知道元素類型的情況下無法做到這一點,但如果您想要一種易於編碼但不是非常有效的方式來讀取它類型 - 無意義的,您可以使用某種東西像

double val=mean(someMat(Rect(x,y,1,1)))[channel]; 

要做得很好,你必須知道類型。在<>方法是安全的方式,但如果你做得正確,直接訪問數據指針通常會更快。

9

上面提供的想法很好。要快速訪問(如果你想使一個實時的應用程序),你可以嘗試以下方法:

//suppose you read an image from a file that is gray scale 
Mat image = imread("Your path", CV_8UC1); 
//...do some processing 
uint8_t *myData = image.data; 
int width = image.cols; 
int height = image.rows; 
int _stride = image.step;//in case cols != strides 
for(int i = 0; i < height; i++) 
{ 
    for(int j = 0; j < width; j++) 
    { 
     uint8_t val = myData[ i * _stride + j]; 
     //do whatever you want with your value 
    } 
} 

指針訪問比Mat.at <>訪問快得多。希望能幫助到你!

+1

指針訪問成本與Mat.at <>完全相同(在發佈時進行編譯時)。唯一的區別是斷言,除非代碼以調試模式編譯,否則它們是活動的。 – 2016-08-17 15:48:30

1

基於@J。 CALLEJA說,你有兩個選擇

隨機存取

如果你想隨機存取墊的元素,只是簡單地使用

at<data_Type>(row_num, col_num) = value; 

連續獲得

如果你想連續訪問,OpenCV提供與STL迭代器兼容的Mat迭代器

MatIterator_<double> it, end; 
for(it = I.begin<double>(), end = I.end<double>(); it != end; ++it) 
{ 
    //do something here 
} 

for(int row = 0; row < mat.rows; ++row) { 
    float* p = mat.ptr(row); //pointer p points to the first place of each row 
    for(int col = 0; col < mat.cols; ++col) { 
     *p++; // operation here 
    } 
} 

我借用一篇博客文章中Dynamic Two-dimensioned Arrays in C

enter image description here