使用OpenCV仅检测图像中的RGB蓝色

时间:2014-03-19 08:05:20

标签: c++ opencv

我正在尝试使用C ++和openCV检测下图中的3个蓝色圆圈。

enter image description here

我使用此代码

int main(){
     Mat original=imread("img.jpg");
     Mat hsv;
     cvtColor(original,hsv,CV_BGR2HSV);
     Mat bw;
     inRange(hsv,Scalar(110,50,50),Scalar(130,255,255),bw);//detects blue
}

此代码确实检测3个蓝色圆圈 BUT 还检测到其他蓝点。我认为它与我指定的范围有关。有没有办法只检测那些RGB蓝色圆圈,因为我认为图像中没有任何其他RGB蓝色点。 如何仅检测此颜色(255,0,0)

2 个答案:

答案 0 :(得分:2)

对于您上面提供的图片,以下阈值可以正常使用。

Scalar hsv_l(110,150,150); 
Scalar hsv_h(130,255,255); 
cvtColor(original,hsv,CV_BGR2HSV);
inRange(hsv,hsv_l,hsv_h,bw) 

您可以使用鼠标轻松找到任何像素的HSV值,如here所述。

此外,HSV色轮(下方)可能有助于选择任何颜色并获得其HSV值。

HSV Colour wheel

答案 1 :(得分:1)

如果要检测由(255,0,0)表示的颜色,则这是使用inRange函数时应指定的值。此外,如果您对RGB颜色感兴趣,那么您不需要将图像转换为hsv。

请注意,OpenCV文档中的relevant page表示inRange函数的上限和下限都包含在内 - 您可以对两者使用相同的值。

一些小修改:

int main()
{
    // Paint a blue square in image
    cv::Mat img = cv::Mat::zeros(100,100,CV_8UC3);
    cv::Scalar blue(255,0,0);

    img(cv::Rect(20,20,50,50)) = blue;
    cv::imshow("Original Image", img);


    // Detect this blue square
    cv::Mat img2;
    cv::inRange(img, blue, blue, img2);
    cv::imshow("Specific Colour", img2);

    cv::imwrite("Input.png",img);
    cv::imwrite("Output.png",img2);
    cv::waitKey(0);

    return 0;
}

<强> Input.png 在图像中绘制的蓝色方块

Input.png

<强> Output.png 在此二进制图像中检测到蓝色方块

Output.png