Accesso a un elemento matrix nell’object “Mat” (non all’object CvMat) in OpenCV C ++

Come accedere agli elementi per riga, nella nuova class “Mat” di OpenCV 2.0? La documentazione è collegata qui sotto, ma non sono stato in grado di capirci qualcosa. http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#mat

Sulla documentazione:

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

Dice:

(…) se conosci il tipo di elemento matrix, ad es. è float, puoi usare il metodo <> ()

Cioè, puoi usare:

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

Forse è più facile usare la class Mat_ . È un modello di wrapper per Mat . Mat_ ha l’ operator() sovraccaricato per accedere agli elementi.

Le idee fornite sopra sono buone. Per un accesso rapido (nel caso in cui desideri fare un’applicazione in tempo reale) puoi provare quanto segue:

 //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 } } 

L'accesso al puntatore è molto più veloce dell'accesso Mat.at <>. Spero che sia d'aiuto!

Basato su cosa @J. Calleja ha detto, hai due scelte

Metodo 1 – Accesso casuale

Se vuoi accedere in modo casuale all’elemento di Mat, basta semplicemente usarlo

 Mat.at(row_num, col_num) = value; 

Metodo 2 – Accesso continuo

Se si desidera un accesso continuo, OpenCV fornisce l’iteratore Mat compatibile con l’ STL iterator ed è più in stile C++

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

o

 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 } } 

Se hai difficoltà a capire come funziona il Metodo 2, prendo in prestito l'immagine da un post del blog nell'articolo Array bidimensionali dinamici in C , che è molto più intuitivo e comprensibile.

Guarda l'immagine qui sotto.

inserisci la descrizione dell'immagine qui

OCV si fa in quattro per assicurarsi che tu non possa farlo senza conoscere il tipo di elemento, ma se vuoi un modo facilmente codificabile ma non molto efficiente per leggerlo in modo agnostico, puoi usare qualcosa come

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

Per farlo bene, devi conoscere il tipo però. Il metodo at <> è sicuro, ma l’accesso diretto al puntatore dati è generalmente più veloce se lo si fa correttamente.