0

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

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.
4

1 回答 1

3

您正在转换为 HSV 颜色空间。这意味着第一、第二和第三图像通道对应于色调、饱和度和值。没有第四个通道,所以你的Scalar论点应该只有三个元素。

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

如果没有发布的示例图像,我只能猜测正确色调角度的范围。这表明范围内的色调值[0, 15]可能[165,180]会很好地工作。由于红色环绕光谱的零点,这将需要两次应用cv::inRange()。对于色调和饱和度,我会使用 range 丢弃低值[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;
于 2013-10-17T15:09:36.040 回答