5

这个问题是关于 VS2008 express 中带有 c++ 的 opencv。

我正在做非常简单的事情。试图从相机图像中获取皮肤值。

正如您在屏幕截图中看到的,相机图像看起来相当不错。我将其转换为 HSV 并将 Hue 通道从中分离出来,以便稍后阈值皮肤值。但是 Hue 通道似乎过于嘈杂和颗粒感。HSV 图像窗口也显示信息的退化。为什么会这样?以及如何解决。如果我们不能通过某种平滑来消除噪音?代码如下:

#include <opencv2/opencv.hpp>
int main(){
    cv::VideoCapture cap(0); // open the default camera   
    cv::Mat hsv, bgr, skin;//make image & skin container
    cap >> bgr; 
    //cvNamedWindow("Image");
    //cvNamedWindow("Skin");    
    //cvNamedWindow("Hue");
    cv::cvtColor(bgr, hsv, CV_BGR2HSV);
    std::vector<cv::Mat> channels;
    cv::split(hsv, channels);
    cv::Mat hue;
    hue = channels[0];  
    cv::imshow("Image", bgr);cvMoveWindow("Image",0,0);
    cv::imshow("HSV", hsv);cvMoveWindow("HSV",660,0);
    cv::imshow("Hue", hue);cvMoveWindow("Hue",0,460);   

    cvWaitKey(0);//wait for key press   
    return 0;   
}

在此处输入图像描述

4

2 回答 2

6

色调通道似乎过于嘈杂和颗粒感。为什么会这样?

在我们看到的现实世界的颜色中,由“色调”表示的信息部分会有所不同。红色完全由色调来描述。黑色根本没有色调信息。

但是,当您在 HSV 中表示颜色时,色调始终是颜色信息的三分之一

因此,当颜色接近任何灰色阴影时,色调分量将被人为地夸大。这就是你看到的颗粒感。越接近灰色,必须放大的色调越多,包括捕获色调的误差。

HSV 图像窗口也显示信息的退化。为什么会这样?

转换中会有舍入误差,但可能没有你想象的那么多。尝试将您的 HSV 图像转换回 BGR,以查看实际发生了多少退化。

以及如何解决。

实际上,您有两种选择。

使用更高质量的相机,或不使用 HSV 格式。

于 2013-03-03T18:42:22.540 回答
1

如果您查看 OpenCV 文档中cvtColor带有参数的函数的公式,CV_BGR2HSV您将拥有

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

现在,当你有一个灰色阴影时,即当 R 等于 B 并且 R 等于 G 时,H 公式中的分数总是未定义的,因为它是零除以零。在我看来,文档没有描述在这种情况下会发生什么。

于 2015-01-23T10:38:47.800 回答