在opencv, c++中转换bgr为hsv

convert bgr to hsv in opencv, C++

本文关键字:bgr hsv 转换 opencv c++      更新时间:2023-10-16

我正在尝试用网络摄像头在BGR中拍摄某人的面部照片,将图片转换为HSV,并分析这些HSV值,这些值将在稍后的皮肤检测算法中使用。不幸的是,这张照片似乎在BGR中进行了分析,即使在我尝试使用cvtColor()转换它之后。

我使用下面的代码来测试我是否使用了正确的颜色空间。注意我尝试将饱和度和值设置为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通道。(我想把图片贴出来,但这是我的第一个帖子,所以我还没有足够的声誉。)

有人知道为什么会这样吗?

您将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。