我有一个手动控制的摄像机的视频流,该视频流放置在桌子上并面向对象。
该物体的形状大致为等腰梯形,其短边始终朝上,但并不总是完全对齐,而是在其中带有孔。
我想立即确定相机何时移出对象视野
我正在使用opencv,可以提取对象的轮廓。
(黑色是背景,灰色是轮廓/凸包,深灰色是边界矩形,带圆圈的点是轮廓的点)
因此,您可以说我正在尝试确定轮廓何时看起来像此5边多边形。可以描述为一个矩形,其中两个顶角都切成三角形
问题是,该对象不是完美的梯形,没有完美对齐,并且偶尔会出现孔,这导致轮廓提取获得更复杂的形状。例如:
其变形但形状仍类似于5面多边形。
由于对象中有孔,因此轮廓可能具有其他一些复杂的形状,因此我需要形状匹配尽可能精确但又健壮以适应不完美的形状。
由于存在孔,我不能简单地使用对象像素与背景像素的比率,而且由于轮廓不是精确的形状,因此很难仅通过轮廓点的位置以编程方式识别形状。我认为模板匹配和形状匹配不是理想的,因为形状的大小未知,并且由于其他形状,轮廓可能是(例如,三角形的顶部朝左)
我需要立即确定相机已从物体上移开,因为它随后会取消我的处理。
最佳答案
当我提出解决方案时回答我的问题,希望它可以对某人有所帮助。
我已经分两步解决了。 1)将轮廓重塑为近似复杂的形状(更多的共线点和直角)。 2)确定新形状是否与5边多边形相同,该5边多边形是从顶角之一中切出三角形的矩形。
1)简化轮廓:
从轮廓点开始,我按点的x值对点进行排序,如果它们的距离小于图像宽度的10%,则将它们分组(基本上只是将沿x轴接近的点分组,暂时忽略它们的y值),然后替换每个点的x值与该组x值的平均值。然后,对y值执行相同的操作,将其与图像高度的10%分组。这试图使点沿x和y轴共线以简化形状。这对我有用,因为我正在尝试为几乎垂直/水平的形状找到点(不适用于成 Angular 形状)
2)在左上角或右上角仅找到一个三角形:
使用opencv,我发现了深灰色轮廓,它是简化形状的边界框减去该形状。
滤除轮廓小于图像面积的5%的轮廓以消除噪点。如果检测到的轮廓超过1个,则不是我们想要的形状。
当我们仅找到1个轮廓时,请使用轮廓逼近消除所有缺陷。如果近似轮廓的点数不是3,则结果应为3点轮廓(代表三角形),这不是我们想要的形状。
然后检查轮廓的3个点,“角”点应位于边界框的左角或右角,“中间”点的y值应等于边界顶侧的y值框,并且“侧面”点的x值应与角点的x值相同。如果不是所有的三个点都满足这些条件,那不是我们想要的形状。
最后,我检查侧面和中间点相对于x轴的 Angular ,就像进行健全性检查一样,以确保在期望倾斜的情况下该 Angular 在10度和80度之间。
关于python - 切掉一个角的矩形的非精确形状检测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51663452/