5

私は、ウェブカメラで誰かの顔の写真を 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 チャンネルを編集しているように見えます。(画像を投稿したいのですが、これが最初の投稿なので、まだ十分な評判がありません。)

なぜこれが起こっているのか誰にも分かりますか?ありとあらゆる考えを歓迎します。

4

1 に答える 1

13

C++ Mat スタイルと古い C IplImage* を混同しているため、正確に何が起こっているのかわかりにくくなっています。inputImageHSV に変換するコードは次のとおりです。

Mat fullImageHSV;
cvtColor(inputImage, fullImageHSV, CV_BGR2HSV);

OpenCV HSV 値は 0 ~ 180 の H であり、S と V は 0 ~ 255 ですが、他のプログラムは異なる値を使用する傾向があることに注意してください。また、OpenCV は HSV 画像を正常に表示できないことに注意してください。これにより、RGB として解釈されるため、色が歪んでしまいます。

于 2013-06-17T20:57:26.897 に答える