单角铜矩形的非精确形状检测

2024-05-13 01:56:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个手动控制的视频流放在桌面上,面向一个物体。 物体的形状大致为等腰梯形,短边总是朝上,但它并不总是完全对齐,而且有洞。在

我想当相机离开物体的视野时立即确认

enter image description here

我使用opencv,可以提取物体的轮廓。 (黑色为背景,灰色为轮廓/凸包,darkgray为边界矩形,带圆圈的点为轮廓点)

enter image description here

所以你可以说,我在试着确定轮廓什么时候看起来像这个5边多边形。它可以描述为一个长方形,从上角切下一个三角形 enter image description here

问题是,对象不是一个完美的梯形,没有完全对齐,并且偶尔有孔,这使得轮廓提取得到更复杂的形状。如: enter image description here

它变形了,但形状仍然类似于5边多边形。 由于物体上的洞,轮廓可能有一些其他复杂的形状,所以我需要形状匹配尽可能精确,但稳健,以适应不完美的形状。在

我不能简单地使用对象像素与背景像素的比率,因为有洞,而且我发现很难通过编程来识别轮廓点的位置,因为它不是一个精确的形状。我假设模板匹配和形状匹配并不理想,因为形状的大小未知,而且轮廓可能是其他形状(例如顶部朝左的三角形)

我需要确认相机已经离开了物体,因为它会影响我的处理。在


Tags: 对象面向像素手动多边形opencv桌面上物体
1条回答
网友
1楼 · 发布于 2024-05-13 01:56:54

回答我的问题,因为我已经想出了一个解决办法,希望它可能会帮助别人。在

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

1)简化轮廓:

从轮廓点开始,我根据它们的x值对点进行排序,如果它们小于图像宽度的10%(基本上只是对靠近x轴的点进行分组,暂时忽略它们的y值),然后用组x值的平均值替换每个点的x值。然后我对y值做同样的处理,以图像高度的10%分组。这将尝试使点沿x轴和y轴共线以简化形状。这对我有用,因为我正在尝试为一个几乎垂直/水平的形状寻找点(不适用于有角度的形状)

enter image description here

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

使用opencv,我找到了暗线轮廓,这是简化形状的边界框减去形状。在

过滤掉面积小于图像面积5%的轮廓,去除噪声。如果检测到一个以上的轮廓,这不是我们想要的形状。在

当我们只找到一个轮廓时,使用轮廓近似来消除任何缺陷。结果应该是一个3点轮廓(代表一个三角形),如果近似轮廓的点不是3,它不是我们想要的形状。在

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

最后,我检查侧面和中间点相对于x轴的角度,以确保角度在10度和80度之间,因为我预期会有一个坡度。在

相关问题 更多 >