书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
一、形状匹配
-
形状匹配用来计算两个对象的形状间的匹配值,
通常情况下,两个对象越相似,其形状匹配值越小。 -
OpenCV提供了函数cv2.matchShapes()用来对两个对象的Hu矩进行比较。
这两个对象可以是轮廓,也可以是灰度图像。
二、语法格式
- 函数cv2.matchShapes()的语法格式为
retval=cv2.matchShapes(contour1, contour2,method, parameter)
其中,retval是返回值。该函数有如下4个参数。
● contour1:第1个轮廓或者灰度图像。
● contour2:第2个轮廓或者灰度图像。
● method:比较两个对象的Hu矩的方法,具体如表8-1所示。
表8-1 method的值及其具体含义
在表8-1中,A表示对象1,B表示对象2,其中:
其中:和
分别是对象A和对象B的Hu矩。
● parameter:应用于method的特定参数,该参数为扩展参数,因此将该值设置为0。
三、匹配度计算
- 使用函数cv2.matchShapes()计算3幅不同图像的匹配度。
import cv2
# --------------读取并绘制原始图像------------------
o1 = cv2.imread('d:\\c1.jpg')
o2 = cv2.imread('d:\\c2.jpg')
o3 = cv2.imread('d:\\cc.jpg')
# --------------提取轮廓------------------
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
contours1, hierarchy = cv2.findContours(binary1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours2, hierarchy = cv2.findContours(binary2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours3, hierarchy = cv2.findContours(binary3, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnt1=contours1[0]
cnt2=contours2[0]
cnt3=contours3[0]
ret0=cv2.matchShapes(cnt1,cnt1,1,0.0)
ret1=cv2.matchShapes(cnt1,cnt2,1,0.0)
ret2=cv2.matchShapes(cnt1,cnt3,1,0.0)
print("o1.shape=",o1.shape)
print("o2.shape=",o2.shape)
print("o3.shape=",o3.shape)
print("相似图像(cnt1,cnt1)的matchShape=",ret0)
print("相似图像(cnt1,cnt2)的matchShape=",ret1)
print("不相似图像(cnt1,cnt3)的matchShape=",ret2)
cv2.imshow('o1',o1)
cv2.imshow('o2',o2)
cv2.imshow('o3',o3)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
输出数据
四、结果分析
- 同一幅图像的Hu矩是不变的,二者差值为0。
例如,图像o1中的对象(手)和自身距离计算的结果为0。 - 对原始图像与对原始图像进行平移、旋转和缩放后得到的图像应用函数cv2.matchShapes()后,得到的返回值较小。
例如,图像o2中的对象是通过对图像o1中的对象进行缩放、旋转和平移得到的,对二者应用函数cv2.matchShapes()后,返回值较小,约为0.08。 - 不相似图像经函数cv2.matchShapes()计算后得到的返回值较大。
例如,图像o1中的对象和图像o3中的对象的差别较大,对二者应用cv2.matchShapes()函数后,返回值较大,约为0.83。
【注意】除使用形状匹配外,还可以通过Hu矩来判断两个对象的一致性。但是Hu矩不如函数cv2.matchShapes()直观。












网友评论