convertir bgr à hsv dans opencv, C++
J'essaie d'avoir une webcam prendre en photo le visage de quelqu'un dans BGR, convertir l'image en VHS, et d'analyser ces HSV valeurs qui seront utilisés par la suite dans une peau algorithme de détection. Malheureusement, la situation semble être analysé dans le BGR, même après que j'ai essayer de le convertir en utilisant cvtColor().
J'utilise le code ci-dessous pour tester si oui ou non je suis en utilisant le droit de l'espace couleur. Remarque la partie où j'ai essayer de régler la saturation et la valeur à 0:
Mat faceROI = findFace(first); //basic Mat, region of interest for face (code not included)
Mat temp;
faceROI.convertTo(temp, CV_8UC3); //making sure this has right no. of channels and such
CvScalar s;
IplImage face_ipl = temp; //new header
IplImage* aNew = cvCreateImage(cvGetSize(&face_ipl), face_ipl.depth, 3);
cvCvtColor(&face_ipl, aNew, CV_BGR2HSV);
for(int x = 0; x < faceROI.cols; x++){
for (int y = 0; y < faceROI.rows; y++){
s = cvGet2D(aNew, x, y);
//vvvvvvvvvvv
s.val[1] = 0; //should be saturation
s.val[2] = 0; //should be value
//^^^^^^^^^^^
cvSet2D(aNew, x, y, s);
}
}
Mat again(aNew); //<--- is this where something is set back to BGR?
imshow("white", again);
cvReleaseImage(&aNew);
Ce produit complètement bleu de photo de mon visage, il semble donc aime je suis en train de modifier le G et R les canaux d'un BGR image, au lieu de S et V voies d'un HSV image. (Je voudrais afficher l'image, mais c'est mon premier post donc je n'ai pas assez de réputation).
Quelqu'un sait pourquoi ce qui se passe? Tout et toutes les pensées sont appréciés.
C'est le cœur de ma question...je ne pense pas que jamais je ne reconvertir BGR, mais les résultats semblent indiquer que c'est ce qu'il se passe.
Peu importe ce que l'espace colorimétrique de l'image, la
imshow
fonction sera toujours interpréter l'image comme un simple RVB ou BGR image. Comme vous l'affectation d' 0
de la S et V canaux, seuls les H canal reste qui correspond à B dans un BGR image. Donc, pour imshow
, again
est un BGR image avec des valeurs uniquement dans le canal bleu. C'est pourquoi vous voyez bleu de sortie.Solution de contournement------> ajouter
cvtColor(again,again,CV_HSV2BGR)
avant imshow
.Votre solution de contournement suggestion vraiment aidé - il m'a donné les résultats escomptés. (J'ai changé la valeur de paramètre à 255 et gardé de la saturation à 0; mon code avec votre suggestion de produit de un pur, blanc, fenêtre, ce qui est logique.) Merci pour votre aide!
OriginalL'auteur Connor | 2013-06-17
Vous devez vous connecter pour publier un commentaire.
Vous avez mélangé le C++ Tapis de style avec le vieux C IplImage*, cela rend confus pour voir ce qui se passe exactement. Voici le code pour activer
inputImage
dans le HSV:Être conscient que l'utilisation d'OpenCV HSV valeurs de H à partir de 0-180 tout en S et V sont de 0 à 255, tandis que d'autres programmes ont tendance à utiliser des valeurs différentes. Notez également que OpenCV est pas en mesure de montrer HSV images normalement, ce qui fausse la couleur parce qu'ils sont interprétés comme des RVB.
Oui, c'est une bonne idée d'en choisir un et le bâton avec le C ou le C++ API. Les deux ont leur propre style unique.
+100 pour la gamme & couleur interprétation explication. J'ai été de me gratter la tête pour ça!!
"notez Également que OpenCV est pas en mesure de montrer HSV images normalement, ce qui fausse la couleur parce qu'ils sont interprétés comme des RVB." Qui est un important gotcha, OpenCV apprenants.
OriginalL'auteur diip_thomas