我正在尝试使用C ++和openCV检测下图中的3个蓝色圆圈。
我使用此代码
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)
答案 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值。
答案 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 强> 在图像中绘制的蓝色方块
<强> Output.png 强> 在此二进制图像中检测到蓝色方块