我目前正在使用 OpenCV 尝试检测黑色布覆盖的桌子上的物体。摄像头不会总是注视同一个方向(它是机器人的头部),但只会处理一张图像,因此速度不是必须的。在移除面积过小的轮廓之前,我已经使用了我能找到的最合适的cv::Canny
参数。cv::findContours
这使我接近我想要的结果,但显然检测到了一些不在表格区域中的轮廓。什么是过滤这些的好方法?我正在考虑三种解决方案(可以组合以获得更好的结果):
- 裁剪图像以保留表格区域,但我想不出一个好的标准(
cv::HoughLines
?)。 - 移除未闭合的轮廓。这并不局限于凸轮廓(例如,右侧的橙色海豚不是)。检查轮廓中第一个
cv::Point
和最后一个之间的距离(这是 a )是否有效?cv::Point
vector<cv::Point>
- 研究每个轮廓外几个像素的圆,并检查 HSV 通道,以确定圆的所有像素是否都足够暗,可以被视为表格的一部分。
如果有人有一种有效的方法来过滤这些轮廓,或者只是输入和建议关于上述一种过滤方法,那就太好了。此外,您可以在右下角看到的机器人手也不会成为问题,因为它们在实际实验期间将不在视野范围内。