繁体   English   中英

在opencv,C ++中将bgr转换为hsv

[英]convert bgr to hsv in opencv, C++

我正在尝试让网络摄像头在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通道。 (我发布了图片,但这是我的第一篇文章,所以我还没有足够的声誉。)

有人知道为什么会这样吗? 任何和所有的想法都表示赞赏。

你将C ++ Mat风格与旧的C IplImage *混合在一起,这使得查看到底发生了什么令人困惑。 以下是将inputImage转换为HSV的代码:

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

请注意,OpenCV HSV值为0-180,而S和V为0-255,而其他程序倾向于使用不同的值。 另请注意,OpenCV无法正常显示HSV图像,这会使颜色失真,因为它们被解释为RGB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM