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);

这会产生一张我的脸完全是蓝色的照片,所以看起来我正在编辑 BGR 图像的 G 和 R 通道,而不是 HSV 图像的 S 和 V 通道。(我会发布图片,但这是我的第一篇文章,所以我还没有足够的声誉。)

有谁知道为什么会这样?任何和所有的想法都值得赞赏。

4

1 回答 1

13

您将 C++ Mat 样式与旧的 C IplImage* 混为一谈,这让人难以理解到底发生了什么。这是inputImage变成HSV的代码:

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 回答