OpenCV valeur rvb pour le cv::Point de cv::Mat
J'ai regardé les différentes questions déjà ici sur StackOverflow, mais aucun ne semble à l'aide.
Ce que je veux faire est assez simple: j'ai un cv::Point
et j'ai besoin d'obtenir la valeur RVB du pixel à ce point dans un cv::Mat
afin que je puisse comparer avec un stockées valeur RVB.
Maintenant, cela devrait être très facile mais j'ai essayé de 1001 façons différentes et il est tout simplement ne fonctionne pas pour moi.
Quelqu'un s'il vous plaît aidez-moi à sortir de ma misère!!
edit:
les deux réponses ci-dessous le travail!
Je suis un peu nouveau avec le C++ et je ne savais pas que la sortie d'un unsigned char
par cout
donne un questionmark!
printf
offcourse donne la bonne valeur!!
OriginalL'auteur user458753 | 2011-01-20
Vous devez vous connecter pour publier un commentaire.
C'est vraiment facile. Toutefois, la documentation de OpenCV est bon à cacher les réponses simples.
Voici un exemple de code:
Il y a probable de meilleures façons de traiter avec le cv::Vec, mais j'ai oublié.
Voir aussi la OpenCV Feuille De Triche.
j'ai un cv::Mat nommé oldImage pas de cv::Mat3b j'ai donc d'abord la copier sur un cv::Mat3b: cv::Mat3b image = oldImage; alors je fais comme vous, dans votre exemple, mais lorsque j'essaie de le reproduire: std::cout << bgr[0] << std::endl; je reçois un questionmark..
merci cela a fonctionné, mais im toujours vous vous demandez quelle est la différence entre un cv::Mat et cv::Mat3b..
Mat3b est un typedef pour Mat_<Vec_<char,3> >. Fondamentalement, c'est un Tapis de type "modèle" de type. Il est plus facile/plus élégant pour accéder aux éléments lorsque vous connaissez le type au moment de la compilation. Mat est une super-classe de toutes les Mat_* les classes, c'est pourquoi vous pouvez utiliser chaque fonction cv aussi sur un Mat_<*>.
Ajouté simplifié (et corrigé) de la notation.
OriginalL'auteur ypnos
Cela dépend du type de l'image/Mat. Si l'image est juste un type normal 1 octet pour chaque rvb par pixel, c'est un moyen d'y accéder. C'est assez efficace, mais pas de la manière la plus sûre:
Si le Tapis est de type différent, alors vous aurez juste besoin de changer la structure de RVB pour correspondre à ce dont vous avez besoin.
Essayez de changer le type de l'image que vous lisez dans la normale à l'image RVB avec ce code:
C'est probablement juste une image rvb puis. Essayez le code ci-dessus, ça marche pour vous?
j'ai essayé ouputting le résultat, mais il semble être vide.. (RVB pix = GetRGB(mat, point); std::cout << pix.r << pix.g << pix.b << std::endl;)
Puis-je voir le code que vous utilisez pour charger dans l'image? Savez-vous si l'image a des valeurs alpha?
j'ai édité la question avec le code
OriginalL'auteur Nick Banks