OpenCv单模版多目标匹配
单模版匹配出现的问题
一、
关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确。
我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征进行比较,如下:
import cv2
img = cv2.imread('/Users/duanhao/Desktop/photo/liukun.jpg')
lk = cv2.imread('/Users/duanhao/Desktop/photo/lk_all.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度
lk_gray = cv2.cvtColor(lk, cv2.COLOR_BGR2GRAY)
new_img = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 3)
new_temple = cv2.adaptiveThreshold(lk_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 3)
# # cv2.imshow('1', new_img)
# # cv2.imshow('2', new_temple)
height, weight, c = lk.shape
result = cv2.matchTemplate(img, lk , cv2.TM_SQDIFF_NORMED) # 标准平均差匹配
minValue, maxValue, minLocal, maxLocal = cv2.minMaxLoc(result)
local1 = minLocal
local2 = (local1[0] + weight, local1[1] + height)
cv2.rectangle(img, local1, local2, (0, 0, 255), 2)
cv2.imshow('data', img)
cv2.waitKey()
cv2.destroyAllWindows()
可是效果依旧不行,还不如原来不调整的图像,这算是我走过的第一条弯路。
二、
cv2里面有一个参数minMaxLoc函数可以提取出匹配样本result的最小值、最大值、最小值的坐标、最大值的坐标。这里坐标(x, y),x对应的是数组的column列,y对应的是数组的rows行,也就是(columns, rows),而cv2里的shape返回的是(rows, columns,channel),不要弄错了。所以在绘制边框的时候是:
height, weight, c = temple.shape
minValue, maxValue, minLocal, maxLocal = cv2.minMaxLoc(result)
local1 = minLocal
local2 = (local1[0] + weight, local1[1] + height)
三、
第一次我需要匹配的图像和模型光线太暗了,所以我在网上找了一个清晰且光线好的图像进行匹配。代码如下:
import cv2
img = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/beauty.png')
lk = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/number1.png')
height, weight, c = lk.shape
result = cv2.matchTemplate(img, lk , cv2.TM_SQDIFF_NORMED) # 标准平均差匹配
minValue, maxValue, minLocal, maxLocal = cv2.minMaxLoc(result)
local1 = minLocal
local2 = (local1[0] + weight, local1[1] + height)
cv2.rectangle(img, local1, local2, (0, 0, 255), 2)
cv2.imshow('result', img)
cv2.waitKey()
cv2.destroyAllWindows()
一开始我选取的temple样图尺寸太小了,所以匹配到的内容也是不准确的。
后来我把temple样图的尺寸取大一点,就可以完美的匹配了!
绿色框是小样图匹配的结果,红色框是大样图匹配的结果,而我的样图正好和红色框的内容一致,算是匹配完美!所以以后需要匹配的样图尽量选尺寸大一点,特征明显一点的,这样方便匹配计算。
单模版多目标匹配
如果一张图片上,有很多相同特征的图片,如何去匹配多个目标,或者通过调节参数,找到唯一个符合要求的图片,把那些特征相同而不完全一致的图片筛除掉。
import cv2
img = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/map.jpg')
temple = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/flag.png')
height, weight, c = temple.shape
cnt = 0
result = cv2.matchTemplate(img, temple, cv2.TM_CCORR_NORMED)
for y in range(len(result)):
for x in range(len(result[y])):
if result[y][x] > 0.952:
cv2.rectangle(img, (x, y), (x + weight, y + height), (0, 0, 255, 2))
cv2.imshow('1', img)
cv2.imshow('2', temple)
cv2.waitKey()
cv2.destroyAllWindows()
需要注意的是x代表水平坐标,y代表垂直坐标。
通过调参数,框选出来的内容正是我截取做样图的部分。如果把参数再调小一点那其他标识也会被识别出来,所以多目标匹配相对灵活一点。
标签:匹配,img,模版,cv2,lk,OpenCv,result,local1 From: https://www.cnblogs.com/itduan/p/17311885.html