L'accès à certains pixels RVB valeur dans openCV
J'ai recherché sur internet et stackoverflow à fond, mais je n'ai pas trouvé de réponse à ma question:
Comment puis-je obtenir/définir (les deux) valeur RVB de certains (donné par les coordonnées x,y) des pixels dans OpenCV? Ce qui est important-je suis en train d'écrire en C++, l'image est stockée dans la cv::Mat variable. Je sais qu'il est un IplImage() de l'opérateur, mais IplImage n'est pas très à l'aise dans l'utilisation-pour autant que je sais qu'il vient de l'API C.
Oui, je suis conscient qu'il y avait déjà cette Pixel accès dans OpenCV 2.2 thread, mais c'est seulement en noir et blanc des images bitmap.
EDIT:
Merci beaucoup pour toutes vos réponses. Je vois, il y a de nombreuses façons d'obtenir/définir les valeurs RVB des pixels. J'ai encore une idée de mon amie merci Benny! C'est très simple et efficace. Je pense que c'est une question de goût de celui qui vous choisissez.
Mat image;
(...)
Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x);
Et puis vous pouvez lire/écrire les valeurs RVB avec:
p->x //B
p->y //G
p->z //R
Vous devez vous connecter pour publier un commentaire.
Essayez ce qui suit:
image.at<cv::Vec3b>(y,x);
vous donne le RVB (il peut être commandé comme BGR) vecteur de typecv::Vec3b
(y,x)
?image.at<cv::Vec3b>(y,x) = cv::Vec3b(0, 0, 255);
Le faible niveau moyen serait d'accéder à la matrice de données directement. Dans une image RVB (qui, je crois OpenCV généralement des magasins de BGR), et en supposant que votre cv::Mat variable est appelée
frame
, vous pourriez obtenir la valeur de bleu à l'emplacement (x
,y
) (à partir du haut à gauche) de cette façon:De même, pour obtenir B, G et R:
Noter que ce code suppose que la foulée est égale à la largeur de l'image.
frame.data[frame.channels()*(frame.cols*y + x)];
?Un morceau de code est plus facile pour les gens qui ont ce problème. Je partage mon code et vous pouvez l'utiliser directement. Veuillez noter que OpenCV magasin de pixels BGR.
La version actuelle permet à l'
cv::Mat::at
fonction pour gérer 3 dimensions. Donc, pour unMat
objetm
,m.at<uchar>(0,0,0)
devrait fonctionner.at
ne fonctionnera pas sur multicanal Mat. Malgré le fait que le 2-dimensions multicanal Mat a la même disposition de la mémoire 3-dimensions du canal simple Tapis de la méthode de jeter l'exception en raison de différences dans le Tapis de l'en-tête.