检测篮子标量值中的红球不会起作用

时间:2013-10-17 14:48:50

标签: opencv computer-vision

我试图通过阈值检测篮子中的红球。我的问题是我认为我的标量值是错误的,因为结果只是黑色。我不确定哪个矢量通道是亮度,色调,饱和度和亮度

enter code here
 Mat  onespoon= image[2];
 Mat onespoonnewcolor;
 Mat newspoon;

 cvtColor(onespoon, onespoonnewcolor, CV_BGR2HSV);

 inRange(onespoonnewcolor, Scalar(30,0,60,30), Scalar(70,7,100,70), newspoon);
 namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for     display.
 imshow( "Display window", newspoon );                   // Show our image inside it.

1 个答案:

答案 0 :(得分:3)

您正在转换为HSV色彩空间。这意味着第一,第二和第三图像通道对应于色调,饱和度和值。没有第四个通道,因此您的Scalar参数应该只有三个元素。

在OpenCV中,色调范围为0到180,饱和度和值范围为0到255.

如果没有发布的示例图片,我只能猜出正确hue angles的范围。这表明范围[0, 15][165,180]中的色调值可能效果很好。由于红色环绕光谱的零点,因此需要两次cv::inRange()的应用。对于色调和饱和度,我会使用范围[20,255]放弃低值。

您的代码可能如下所示,之后newspoon包含inRange次传递的结果:

cv::Mat temp1, temp2;
cv::inRange(onespoonnewcolor, cv::Scalar(0,20,20), cv::Scalar(15,255,255), temp1);
cv::inRange(onespoonnewcolor, cv::Scalar(165,20,20), cv::Scalar(180,255,255), temp2);
cv::Mat newspoon;
cv::bitwise_or(temp1, temp2, newspoon);

正如评论中指出的那样,只需一次调用inRange()就可以做到这一点,这样做效率更高,并且消除了一些临时变量:

cv::Mat newspoon;
cv::inRange(onespoonnewcolor, cv::Scalar(16,20,20), cv::Scalar(164,255,255), newspoon);
newspoon = 255 - newspoon;