首先,感谢所有stackoverflow用户的帮助。对此,我真的非常感激。
所以,我做了一个彩色物体检测程序。我能够控制鼠标点击甚至在MS涂料中涂抹一些东西。
现在,我必须在我的大学工程设计竞赛中展示我的作品。我需要让我的计划更有效。首先,我用来跟踪和移动的对象是一个红色的对象,我通过调整HSV值过滤掉周围的颜色。
但是,当我在不同的环境中尝试我的代码时,我看到了一些问题。周围有许多红色的物体,我的程序正在检测这些物体并给我错误的价值。
所以,我的目标是: - 我必须使我的程序几乎在所有环境中工作,并使程序独立于后台。我的程序应该只跟踪和检测我想要的对象。从那以后,我是大一新生,我的知识有限。所以,我想从stackoverflow专家那里得到一些建议。谢谢。请不要像我想要的那样理解源代码并纠正我的错误。
答案 0 :(得分:0)
假设您有二进制图像作为颜色过滤的输出,那么:
findContours()
- 函数(http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours)来提取对象。你可以得到所有红色物体的轮廓,包括你的可乐帽。现在你必须区分你的可乐帽和其他红色物体。在您的情况下,使用形状特征(如您所提到的)和对象的圆形度(帽子是圆形的)是合适的。:
区域可以通过contourArea()
- 函数(http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#contourarea)计算,并与阈值进行比较。
对象的圆形度可以通过circularity = (4*PI*A)/P^2
计算,其中 A 是区域(由上述函数计算), P 是物体的周长。周长是arcLength()
- 函数(http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#arclength)的输出。圆的圆度为1.您可以将对象的值与其进行比较。
总而言之,使用对象的区域和对象的圆形功能来区分其他红色对象的焦炭上限。
答案 1 :(得分:0)
为了减少噪音(错误检测的数量),您可以尝试使用双阈值(我可能错了,但我认为它被称为滞后阈值处理,Canny边缘检测器中使用的方法):
你需要创建2个图像,一个阈值t1 = 50,另一个t2 = 150(你可以调整参数以获得更稳定的性能,即启发式找到最佳值)。
对于t2中的每个非黑色像素(x,y):floodFill t1,灰色位于(x,y),floodFill t2黑色位于(x,y)
完成后擦除t1中的所有非灰色像素。
现在t1应该对彩球的可能位置进行很好的可能性估计。
注意:阈值处理不会意味着你必须使用opencv" threshold"功能。您可以自己编写一个颜色和颜色将在其中传递的范围作为输入。
如果您只寻找一个球,只需使用findContours功能查找最大区域的轮廓。
不要试图达到100%的表现,记住:"完美是好的敌人" - Arisotle。