私は、ウェブカメラで誰かの顔の写真を BGR で撮影し、その写真を HSV に変換し、後で皮膚検出アルゴリズムで使用されるこれらの HSV 値を分析しようとしています。残念ながら、cvtColor() を使用して変換しようとしても、画像は BGR で分析されているようです。
以下のコードを使用して、正しい色空間を使用しているかどうかをテストします。彩度と値を 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);
これにより、私の顔の完全に青い写真が生成されるため、HSV 画像の S および V チャンネルではなく、BGR 画像の G および R チャンネルを編集しているように見えます。(画像を投稿したいのですが、これが最初の投稿なので、まだ十分な評判がありません。)
なぜこれが起こっているのか誰にも分かりますか?ありとあらゆる考えを歓迎します。