我试图让网络摄像头拍摄某人面部的BGR照片,将其转换为HSV,并分析这些HSV值,以后将在皮肤检测算法中使用。不幸的是,即使我尝试使用cvtColor()进行转换,该图片似乎仍然以BGR格式进行分析。
我使用下面的代码来测试是否使用了正确的颜色空间。请注意我尝试将饱和度和值设置为0的部分:
这将生成一张完全蓝色的人脸图片,因此似乎我正在编辑BGR图像的G和R通道,而不是HSV图像的S和V通道。 (我会发布图片,但这是我的第一篇文章,所以我还没有足够的声望。)有人知道这是为什么吗?非常感谢任何想法。
我使用下面的代码来测试是否使用了正确的颜色空间。请注意我尝试将饱和度和值设置为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通道。 (我会发布图片,但这是我的第一篇文章,所以我还没有足够的声望。)有人知道这是为什么吗?非常感谢任何想法。
imshow
函数总是将其解释为简单的RGB或BGR图像。由于您正在将0
分配给S和V通道,因此只剩下H通道,它对应于BGR图像中的B。因此,对于imshow
函数,again
是一个仅在蓝色通道中具有值的BGR图像。这就是为什么您看到蓝色输出的原因。 - sgarizviimshow
之前添加cvtColor(again,again,CV_HSV2BGR)
。 - sgarizvi