我们使用Hu矩进行形状匹配。Hu矩具有平移、旋转和缩放不变性,因此可以处理不同旋转角度的长方形。
步骤:
注意:OpenCV的matchShapes函数返回一个值,表示两个形状的差异程度。值越小,形状越相似。
函数原型:cv2.matchShapes(contour1, contour2, method, parameter)
其中,method常用的是cv2.CONTOURS_MATCH_I1, cv2.CONTOURS_MATCH_I2, cv2.CONTOURS_MATCH_I3。
我们选择其中一种,并设置一个阈值。
但是注意:题目给的是二值mask,而不是轮廓。因此有两种方法:
a) 使用轮廓匹配:先找到轮廓,然后匹配轮廓。
b) 使用整个区域的矩(包括内部)计算Hu矩,然后自己比较Hu矩的差异。
这里我们采用OpenCV的matchShapes函数,它需要轮廓作为输入。所以步骤:
另外,也可以直接使用moments计算Hu矩,然后自己定义相似度函数(比如对数变换后的矩的差值),但OpenCV的matchShapes已经封装好了。
我们将采用以下步骤:
注意:matchShapes的返回值是0到正无穷,但通常同一类物体在同样的姿态下返回值很小(<1),但如果有旋转、缩放,由于Hu矩的不变性,返回值也会很小。
示例代码:
以下是一个完整的 Python OpenCV 程序,可以处理旋转的长方形等物体,通过 Hu 不变矩比较两个二值化 mask 中的物体是否为同类型:
核心函数:
are_same_type()
:接受两个二值化 mask,计算它们的形状相似度cv2.matchShapes()
函数,该函数基于 Hu 不变矩计算形状相似度关键特性:
threshold
参数控制相似度判断的严格程度min_area
参数忽略过小的物体参数调整:
threshold
:建议值范围 0.05-0.2
min_area
:根据图像尺寸调整,避免噪声干扰示例结果:
形状相似度值: 0.0023
和 是否为同类型物体: 是
对于不同尺寸的相同形状:
处理多个物体:
性能优化:
此程序能有效处理旋转、不同大小的相似形状,但请注意它主要基于形状特征,对于纹理、颜色等特征无法识别。