cv2.matchShapes() --OpenCV




  • contour1:轮廓向量或者灰度图。
  • contour2:轮廓向量或者灰度图。
  • method:使用的比较方式。
  • parameter:现在没用,直接设为 0。


步骤:

  • 1. 将待识别图像 -> 灰度图像 -> 二值图像
  • 2. 通过轮廓检索函数 cv.findContours 找到待识别图像所有轮廓
  • 3. 模板图像 -> 灰度图像 -> 二值图像
  • 4. 通过轮廓检索函数 cv.findContours 找到模板图像中字母 A 的外轮廓
  • 5. 将第2步得到的轮廓逐一和第4步得到的轮廓 通过 cv.matchShapes 函数进行形状匹配。找到其中最小值,最小值对应的待识别图像中的轮廓即为匹配到的模板图像
  • 6. 标出在待识别图像中找到的模板图像



cv2.matchShapes() 可以检测两个形状之间的相似度,返回值越小,越相似。先读入下面这张图片:


import cv2
import matplotlib.pyplot as plt
import numpy as np

p = '../14-Contour-Features/shapes.jpg'

img = cv2.imread(p)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt_a, cnt_b, cnt_c = contours[0], contours[1], contours[2]
print(cv2.matchShapes(cnt_b, cnt_b, 1, 0.0))
print(cv2.matchShapes(cnt_b, cnt_c, 1, 0.0))
print(cv2.matchShapes(cnt_b, cnt_a, 1, 0.0))
0.0
2.176955476018705e-05
0.4181711500194456



可以看到 BC 相似程度比 AB 高很多,并且图形的旋转或缩放并没有影响。其中,参数 3 是匹配方法,详情可参考:ShapeMatchModes,参数 4 是 OpenCV 的预留参数,暂时没有实现,可以不用理会。

形状匹配是通过图像的Hu矩来实现的(cv2.HuMoments()),大家如果感兴趣,可以参考:Hu-Moments