使用OpenCV检测颜色的最有效方法?

时间:2012-02-21 19:23:57

标签: c++ visual-studio-2010 image-processing opencv

我使用以下方式在我的图像中心附近设置了一个感兴趣的区域:

Mat frame;
//frame has been initialized as a frame from a camera input
Rect roi= cvRect(frame.cols*.45, frame.rows*.45, 10, 8);
image_roi= frame(roi);
//I stoped here not knowing what to do next

我正在使用相机,在我抓住相框的任何时候,ROI将在30%到100%之间填充我想要的颜色,在这种情况下为红色。知道当前帧中是否存在红色的最有效方法是什么?

解决方案:

image_roi= frame(roi);// a frame from my camera as a cv::Mat
cvtColor(image_roi, image_roi, CV_BGR2HSV);
thrs= new Mat(image_roi.rows, image_roi.cols, CV_8UC1);//allocate space for new img
inRange(image_roi, Scalar(0,100,100), Scalar(12,255,255), *thrs);//do hsv thresholding for red
for(int i= 0; i < thrs->rows; i++)//sum up
{
    for(int j=0; j < thrs->cols; j++)
    {
        sum= sum+ thrs->data[(thrs->rows)* i + j];
    }
}
if(sum> 100)//my application only cares about red
    cout<<"Red"<<endl;
else
    cout<<"White"<<endl;
sum=0;

2 个答案:

答案 0 :(得分:4)

此解决方案不仅应解决红色问题,还应解决任何颜色分布

  1. 获取投资回报率的颜色直方图,二维色调和饱和度直方图(请参阅示例here)。
  2. 使用calcBackProjectproject the histogram back in the full image。您将获得更大的值,其颜色在直方图的模式附近呈现颜色(在本例中为红色)。
  3. 阈值结果以获得更符合分布的像素(在本例中为“最佳红色”)。
  4. 例如,可以使用此解决方案来获得一个简单但非常实用的皮肤检测器

答案 1 :(得分:3)

我假设您只想知道投资回报率中红色的百分比。如果这不正确,请澄清。

我会扫描ROI并将每个像素转换为更好的色彩空间以进行颜色比较,例如YCbCr或HSV。然后我会计算色调在红色色调的某个增量范围内(通常在色轮上为0度)的像素数。您可能需要处理一些边缘情况,其中亮度或饱和度太低而人类认为它们是红色的,即使从技术上来说它们也是,取决于您想要实现的目标。