1 cv2.pointPolygonTest() 查找图像中的点与轮廓线之间的最短距离
此函数查找图像中点与轮廓线之间的最短距离。当点在轮廓线外时,返回的距离为负,点在轮廓线内时返回的距离为正,点在轮廓线上返回的距离为零。
函数原型: retval = cv2.pointPolygonTest(contour,point,measureDist)
参数:
- contoure1:图像中的轮廓
- point: 图像中的点
- measureDist:如果为True,函数估计从该点到最近轮廓边的带符号距离。否则,函数只检查点是否在轮廓线内。
返回值:
- retval:该函数确定点是在轮廓线内、外还是在边缘上(或与顶点重合)。相应地,它返回正(内部)、负(外部)或零(沿边)值。
当measureDist为True时,返回值为该点与最近的轮廓边之间的有符号距离;
当measureDist为False时,返回值分别为+1、-1和0
2 cv2.matchShape() 匹配(比较)两个轮廓
OpenCV附带了一个函数cv.matchShapes(),它使我们能够比较两个形状或两个轮廓,并返回一个显示相似性的度量。结果越低,匹配越好。它是基于hu矩值计算的。
函数原型: retval = cv2.matchShape(cnt1, cnt2,method,param)
参数:
- cnt1、cnt2:两个比较的的轮廓,数组
- method: 比较参数1和2相似度的方法,int 。opencv提供了三种如下:CV_CONTOURS_MATCH_I1 = 1;CV_CONTOURS_MATCH_I2 = 2;CV_CONTOURS_MATCH_I3 = 3
- param:float,目前还不支持,直接赋值0。
返回值:
- retval: float。结果越低,匹配越好。它是基于hu矩值计算的。
3 示例:
import cv2
import numpy as np# 1 读取图像
img = cv2.imread('C:/Users/xxx/Downloads/matchImg.png',0)# 2 二值化图像
ret, thresh = cv2.threshold(img, 127, 255,0)# 3 查找轮廓
contours,hierarchy = cv2.findContours(thresh,2,1)n=len(contours) #轮廓个数
contoursImg=[]
cv2.imshow("original",img) #显示原图
# 逐一在全黑背景上绘制并显示轮廓
for i in range(n):
temp = np.zeros(img.shape, np.uint8) # 生成黑背景
contoursImg.append(temp)
contoursImg[i] = cv2.drawContours(contoursImg[i], contours, i, (255, 255, 255), 3) # 绘制轮廓
cv2.imshow("contours[" + str(i) + "]", contoursImg[i])#显示轮廓
# 计算点(100,100)到轮廓线的距离
retval=cv2.pointPolygonTest(contours[i],(100,100),True)
print(f"点(100,100)到轮廓线{i}之间的最短距离={retval}.")
# 逐一匹配各个轮廓的匹配度
for i in range(n):
cnt1 = contours[i]
for j in range(i+1,n):
cnt2 = contours[j]
ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print(f'轮廓线{i}与轮廓线{j}的匹配结果 = {ret}.')
cv2.waitKey()
cv2.destroyAllWindows()ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print( ret )
运行结果如下:
点(100,100)到轮廓线0之间的最短距离=-193.1035991378721. 点(100,100)到轮廓线1之间的最短距离=-124.1933975700802. 点(100,100)到轮廓线2之间的最短距离=-76.48529270389177. 点(100,100)到轮廓线3之间的最短距离=-3.0. 轮廓线0与轮廓线1的匹配结果 = 0.014466617923582503. 轮廓线0与轮廓线2的匹配结果 = 0.7722879434702737. 轮廓线0与轮廓线3的匹配结果 = 1.6770975646890678. 轮廓线1与轮廓线2的匹配结果 = 0.7578213255466912. 轮廓线1与轮廓线3的匹配结果 = 1.6626309467654852. 轮廓线2与轮廓线3的匹配结果 = 1.0329659577085004.