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
Si vous voulez accéder de manière aléatoire à l’élément de Mat, utilisez simplement
Mat.at(row_num, col_num) = value;
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.
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.