opencv 利用cv.matchShapes()函數(shù)實(shí)現(xiàn)圖像識(shí)別技術(shù)
發(fā)布時(shí)間:2022-08-22 點(diǎn)擊數(shù):2844
在待識(shí)別圖像上找到模板圖像
待識(shí)別圖像:
模板圖像:
識(shí)別原理
1. 將待識(shí)別圖像 -> 灰度圖像 -> 二值圖像
2. 通過輪廓檢索函數(shù) cv.findContours 找到待識(shí)別圖像所有輪廓
3. 模板圖像 -> 灰度圖像 -> 二值圖像
4. 通過輪廓檢索函數(shù) cv.findContours 找到模板圖像中字母 A 的外輪廓
5. 將第2步得到的輪廓逐一和第4步得到的輪廓 通過 cv.matchShapes 函數(shù)進(jìn)行形狀匹配。找到其中最小值,最小值對(duì)應(yīng)的待識(shí)別圖像中的輪廓即為匹配到的模板圖像
6. 標(biāo)出在待識(shí)別圖像中找到的模板圖像
實(shí)驗(yàn):圖像匹配
import cv2 as cv
import numpy as np
# 載入原圖
img = cv.imread('abc.jpg', 0)
# 在下面這張圖像上作畫
image1 = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
# 二值化圖像
_, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# 搜索輪廓
contours, hierarchy = cv.findContours(thresh, 3, 2)
hierarchy = np.squeeze(hierarchy)
# 載入標(biāo)準(zhǔn)模板圖
img_a = cv.imread('template_a.jpg', 0)
_, th = cv.threshold(img_a, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
contours1, hierarchy1 = cv.findContours(th, 3, 2)
# 字母A的輪廓
template_a = contours1[0]
# 記錄最匹配的值的大小和位置
min_pos = -1
min_value = 2
for i in range(len(contours)):
# 參數(shù)3:匹配方法;參數(shù)4:opencv預(yù)留參數(shù)
value = cv.matchShapes(template_a,contours[i],1,0.0)
if value < min_value:
min_value = value
min_pos = i
# 參數(shù)3為0表示繪制本條輪廓contours[min_pos]
cv.drawContours(image1,[contours[min_pos]],0,[255,0,0],3)
cv.imshow('result',image1)
cv.waitKey(0)
cv.destroyAllWindows()
實(shí)驗(yàn)結(jié)果