Accéder à un élément de masortingce dans l’object «Mat» (pas l’object CvMat) dans OpenCV C ++

Comment accéder aux éléments par rangée, col dans la nouvelle classe “Mat” d’OpenCV 2.0? La documentation est liée ci-dessous, mais je n’ai pas été en mesure de la comprendre. http://opencv.willowgargarage.com/documentation/cpp/basic_structures.html#mat

Sur la documentation:

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

Ça dit:

(…) si vous connaissez le type d’élément de masortingce, par exemple s’il est flottant, vous pouvez utiliser la méthode <> ()

C’est-à-dire que vous pouvez utiliser:

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

Peut-être qu’il est plus facile d’utiliser la classe Mat_ . C’est un modèle de wrapper pour Mat . Mat_ a l’ operator() surchargé pour accéder aux éléments.

Les idées fournies ci-dessus sont bonnes. Pour un access rapide (au cas où vous souhaiteriez faire une application en temps réel), vous pouvez essayer les solutions suivantes:

 //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 _ssortingde = image.step;//in case cols != ssortingdes 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'access au pointeur est beaucoup plus rapide que l'access à Mat.at <>. J'espère que ça aide!

Basé sur quoi @J. Calleja a dit, vous avez deux choix

Méthode 1 – Accès aléatoire

Si vous voulez accéder de manière aléatoire à l’élément de Mat, utilisez simplement

 Mat.at(row_num, col_num) = value; 

Méthode 2 – Accès continu

Si vous souhaitez un access continu, OpenCV fournit Mat itatorator compatible avec STL iterator et son style plus C++ .

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

ou

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

Si vous rencontrez des difficultés pour comprendre le fonctionnement de la méthode 2, j'emprunte l'image d'un article de blog de l'article Tableaux dynamics à deux dimensions en C , beaucoup plus intuitif et compréhensible.

Voir l'image ci-dessous.

entrez la description de l'image ici

OCV fait tout ce qui est en son pouvoir pour s’assurer que vous ne pouvez pas y parvenir sans connaître le type d’élément, mais si vous voulez un moyen facile à coder mais pas très efficace de le lire de manière agnostique, vous pouvez utiliser

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

Pour bien le faire, vous devez cependant connaître le type. La méthode at <> est la méthode la plus sûre, mais l’accès direct au pointeur de données est généralement plus rapide si vous le faites correctement.