切掉一个角的矩形的非精确形状检测

时间:2018-08-02 23:33:34

标签: python opencv shapes template-matching

我将手动控制的摄像机的视频流放在桌子上并面向桌子上的对象。 该物体的形状大致为等腰梯形,其短边始终朝上,但并不总是完全对齐,而是在其中带有孔。

我想立即确定相机何时移出对象视野

enter image description here

我正在使用opencv,可以提取对象的轮廓。 (黑色是背景,灰色是轮廓/凸包,深灰色是边界矩形,带圆圈的点是轮廓的点)

enter image description here

所以您可以说我正在尝试确定轮廓何时看起来像此5边多边形。可以描述为一个矩形,其中两个顶角的任意一个都切成三角形 enter image description here

问题在于,该对象不是完美的梯形,没有完美对齐,并且偶尔会出现孔,这导致轮廓提取得到更复杂的形状。例如: enter image description here

它已变形,但形状仍类似于5边形多边形。 由于物体上有孔,所以轮廓可能会具有其他一些复杂的形状,因此我需要形状匹配尽可能精确且坚固,以适应不完美的形状。

由于孔的原因,我不能简单地使用对象像素与背景像素的比率,而且由于轮廓不是精确的形状,因此很难仅通过轮廓点的位置以编程方式识别形状。我认为模板匹配和形状匹配不是理想的,因为形状的大小未知,并且由于其他形状,轮廓可能是(例如,三角形的顶部朝左)

我需要立即确定相机已从物体上移开,因为它随后会取消我的处理。

1 个答案:

答案 0 :(得分:0)

在我提出解决方案时回答我的问题,希望它可以对某人有所帮助。

我已经分两步解决了。 1)将轮廓重塑为近似的复杂形状(更多的共线点和直角)。 2)确定新形状是否与5边多边形相同,该5边多边形是从顶角之一切出的三角形的矩形。

1)简化轮廓:

从轮廓点开始,我按点的x值对它们进行排序,如果它们的距离小于图像宽度的10%,则将它们分组(基本上只是将沿x轴接近的点分组,暂时忽略它们的y值) ),然后将每个点的x值替换为该组x值的平均值。然后,对y值执行相同的操作,将其与图像高度的10%分组。这试图使这些点沿x和y轴共线以简化形状。这对我有用,因为我正在尝试为几乎垂直/水平的形状找到点(不适用于成角度的形状)

enter image description here

2)仅在左上角或右上角找到一个三角形:

使用opencv,我发现了暗灰色的轮廓,它是简化形状的边界框减去形状后的结果。

过滤掉轮廓小于图像面积5%的轮廓以消除噪点。如果检测到的轮廓超过1个,则不是我们想要的形状。

当我们仅找到1个轮廓时,请使用轮廓近似法消除任何缺陷。如果近似轮廓的点数不为3,则该结果应为3点轮廓(代表三角形),不是我们想要的形状。

然后我们检查轮廓的3个点,“角”点应位于边界框的左或右角,“中间”点的y值应等于顶侧的y值边界框的“ x”值,并且“侧面”点的x值应与角点的x值相同。如果不是所有三个点都满足这些条件,那不是我们想要的形状。

最后,我检查侧面和中间点相对于x轴的角度,就像进行完整性检查一样,以确保该角度在我期望的斜度在10度到80度之间。