#模板匹配
import cv2 as cv
import numpy as np
def template_demo():
dog = cv.imread("E:/opencv/picture/dog.jpg")
dog_nose = cv.imread("E:/opencv/picture/nose.jpg")
cv.imshow("dog",dog)
result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED)
h,w =dog_nose.shape[:2]
min_val,max_val,min_loc,max_loc=cv.minMaxLoc(result)
pt1 = max_loc
pt2 = (pt1[0]+w,pt1[1]+h)
cv.rectangle(dog,pt1,pt2,(0,255,0),2)
cv.imshow("match",dog)
print(result)
#src = cv.imread("E:/opencv/picture/dog.jpg")
#cv.imshow("inital_window",src)
template_demo()
cv.waitKey(0)
cv.destroyAllWindows()
分析:
模板匹配通常用于目标检测。本文我们检测狗图片的鼻子。
• 我们需要两个主要组件:
1. 源图像(I):我们期望找到与模板图像匹配的图像
2. 模板图像(T):将与模板图像进行比较的补丁图像
1.
result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED)
void cv::matchTemplate(
cv::InputArray image, // 待匹配图像W*H
cv::InputArray templ, // 模板图像,和image类型相同, 大小 w*h
cv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)*(H-h+1)
int method // 用于比较的方法
);
其中method有:
TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好
TM_CCORR_NORMED,TM_CCOEFF_NORMED匹配数值越大表示匹配效果越好
result参数:(保存各个点匹配结果的参数)
模板匹配函数cvMatchTemplate依次计算模板与待测图片的重叠区域的相似度,并将结果存入映射图像result当中,也就是说result图像中的每一个点的值代表了一次相似度比较结果
模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算
我们可以通过cv.minMaxLoc函数来确定结果矩阵的最大值和最小值的位置。
2.
cv.minMaxLoc(result)
返回result数值中最小值以及最小值所在的位置和最大值以及最大值所在的位置。
3.
当知道哪个点匹配度最高时这个时候我们需要用矩阵把模板给标出来
C++: void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)
第一个参数:要在哪个图像上画?
第二个参数:矩阵的左上角点坐标
第三个参数:矩阵的右下角点坐标
第四个参数:颜色
2022-10-22 12:01:12
20KB
opencv
1