我试图让网络摄像头在 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 通道。(我会发布图片,但这是我的第一篇文章,所以我还没有足够的声誉。)
有谁知道为什么会这样?任何和所有的想法都值得赞赏。