L'accès aux éléments d'un cv::Mat avec at<float>(i, j). Est-il (x,y) ou (ligne,col)?
Lorsque nous avons accès à des éléments spécifiques d'un cv::Mat structure, nous pouvons utiliser des tapis.(i,j) pour accéder à l'élément à la position i,j. Ce n'est pas immédiatement clair, cependant, si (i,j) désigne la coordonnée x,y dans la matrice, ou de la i-ème ligne et la j-ème colonne.
OriginalL'auteur Chris | 2011-11-18
Vous devez vous connecter pour publier un commentaire.
OpenCV, comme peuvent l'être d'autres bibliothèques, de traiter des matrices (et des images) dans la rangée ordre majeur. Cela signifie que chaque accès est défini comme
(row, column)
.Exceptions notables à cette règle générale sont Matlab et modes Propres bibliothèques.
Il peut être stocké dans la colonne ordre majeur en interne, mais l'indexation est faite en mathématiques standard (ligne,col) de l'ordre et les matrices sont de même spécifié dans la ligne ordre majeur. Avez-vous déjà travaillé avec MATLAB pour au moins 1 minute ou est-ce que Wikipédia c'est de votre côté? Gardez à l'esprit que la question était à propos de l'indexation et pas sur le stockage. Ceux-ci peuvent coïncider, mais ils n'avaient pas, au moins, quand il ya un supplément de couche d'abstraction entre les deux.
Notez que cette réponse est incorrecte comme elle est et contient incorrecte des informations trompeuses. J'ai édité (c'est dans l'examen par les pairs), mais également posté une version correcte ci-dessous: stackoverflow.com/a/42327350/1345959
Bien sûr, vous avez raison, il y a une distinction entre l'accès à la commande (API) et de stockage de l'ordre (un détail de l'implémentation), mais je ne pense pas que c'est une bonne idée de modifier les réponses des autres, surtout de ne pas changer de sens. Publier vos réponse (qui vous l'avez fait) et essayer de rediriger les gens vers elle.
Yep, après quelques réflexion et d'examen des commentaires je suis certainement d'accord. Merci pour l'affichage. C'est si dur de voir ce que la accepté de répondre 😉 d'autant que ce pop-up haut dans les résultats de recherche Google.
OriginalL'auteur
OpenCV, comme beaucoup d'autres bibliothèques, de traiter de la matrice accès en ligne ordre majeur. Cela signifie que chaque accès est défini comme
(row, column)
. Notez que si vous travaillez avec des coordonnées x et y d'une image, cela devient(y, x)
, siy
est votre axe vertical.De la matrice de la plupart des bibliothèques sont les mêmes en ce sens, l'accès est
(row, col)
ainsi, par exemple, Matlab ou Eigen (C++ bibliothèque de matrice).L'une de ces applications et les bibliothèques ne diffèrent cependant est de savoir comment les données sont en fait stockées dans la mémoire. OpenCV stocke les données dans la ligne ordre majeur dans la mémoire (c'est à dire les lignes viennent en premier), alors que par exemple Matlab stocke les données dans la colonne ordre majeur dans la mémoire. Mais si vous êtes juste un utilisateur de ces bibliothèques, et de l'accès aux données par l'intermédiaire d'un
(row, col)
accesseur, vous ne serez jamais réellement voir cette différence dans de la mémoire de stockage afin.OriginalL'auteur
Donc OpenCV poignées de cela un peu étrange. OpenCV magasins le Tapis, en ligne de commande importante, mais la résolution sur le methood Mat::a() suggère à tort commande colonne principale. Je pense que le Opencv documentation est trompeur dans ce cas. J'ai eu à écrire ce cas de test pour s'assurer par moi-même.
Si l'adressage est effectué avec Mat::a(y,x) :
Mais pointeur brut d'accès révèle qu'il est en fait stocké en ligne majeur, par exemple, le "2" est dans la 4ème position. Si elle a été stockée dans la colonne ordre majeur, il serait dans la 2ème position.
Que d'un côté remarque: Matlab magasins et adresses une matrice dans la colonne ordre majeur. Il pourrait être ennuyeux, mais au moins il est cohérent.
Je crois que OpenCV aborder méthode suit le calcul de la terminologie pour les matrices, les lignes x colonnes, de sorte que vous avez Mat::at(ligne, col).
Cette réponse contient aussi des informations fausses. La matrice d'accès dans OpenCV est de la ligne premier (par exemple
Mat::at(row, col)
). Il est (ligne, col) dans Matlab. La différence entre OpenCV et Matlab est une mémoire de stockage de l'ordre, mais c'est complètement indépendant de l'accès à l'matrices avec(row, col)
. Voir ma réponse ci-dessous pour plus de détails.En effet, l'ordre d'accès et de stockage de l'ordre sont deux choses distinctes (comme indiqué dans la réponse). Cependant, je dirais que la réponse est pas fournir de fausses informations. Il se borne à indiquer que l'on pourrait aisément être confondu (par exemple, lors de la venue de Matlab) en ayant de la ligne majeure de stockage de l'ordre et de l'aide d'un accès API avec les
(row, col)
convention. Au moins, il me troublait de retour dans la journée, parce que j'ai pris le premier paramètre à la "stockage de grand dimension".Si ce n'était pas assez déroutant,
cv::Point
par la convention est construit (x, y). Donc:m.at(y, x)
est le même quem.at(Point(x, y))
.OriginalL'auteur
De ce que j'ai lu dans la documentation, il est
at(y, x)
(c'est à direrow, col
).OriginalL'auteur
Depuis
cv::Mat
est en fait une matrice, avec des images qu'un cas particulier, il résulte de la matrice d'indexation et, par conséquent, la ligne (y
) vient avant la colonne (x
):OriginalL'auteur