032-OpenCV模板匹配单个对象、多个对象

话不多说,上代码,看结果。

import cv2  # 导入库
'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('24.jpg')
img1 = cv2.imread('25.PNG')
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
cv2.imshow('img1', img1)
'''
    cv2.matchTemplate(image, templ, method, result, mask)
    模板匹配
# image: 待搜索图像(大图) templ: 搜索模板, 需和原图一样的数据类型且尺寸不能大于源图像
# result: 比较结果的映射图像, 其必须为单通道, 32位浮点型图像, 如果原图(待搜索
# 图像)尺寸为W x H, 而templ尺寸为 w x h, 则result尺寸一定是(W-w+1)x(H-h+1)
# method: 指定的匹配方法, 有如下6种:
# cv2.TM_SQDIFF ------平方差匹配法(最好匹配0)
# cv2.TM_SQDIFF_NORMED ------归一化平方差匹配法(最好匹配0)
# cv2.TM_CCORR ------相关匹配法(最坏匹配0)
# cv2.TM_CCORR_NORMED ------归一化相关匹配法(最坏匹配0)
# cv2.TM_CCOEFF ------系数匹配法(最好匹配1)
# cv2.TM_CCOEFF_NORMED ------化相关系数匹配法(最好匹配1)
'''
img2 = cv2.matchTemplate(img, img1, cv2.TM_CCORR_NORMED)
'''
    cv2.minMaxLoc(src, mask=None)
src是一个矩阵。求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。
'''
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(img2)
print(min_val, max_val, min_loc, max_loc)
top_left = max_loc
bottom_right = (max_loc[0]+img1.shape[0], max_loc[1]+img1.shape[1])
'''
    cv2.rectangle(img,pt1,pt2,color,thickness,lineType,shift)
# 画矩形
# img,被画矩形的图像  pt1、pt2矩形的左上角、右下角坐标
# color,直线的颜色,BGR颜色  thickness,线的宽度,-1的时候表示填充矩形
# lineType,有三种cv2.LINE_AA、cv2.LINE_4、cv2.LINE_8
# cv2.LINE_AA抗锯齿,这种类型的线看起来平滑点
# shift,坐标精确到小数点后第几位
'''
cv2.rectangle(img, top_left, bottom_right, [0, 255, 0], 2)
cv2.imshow('img', img)
'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
接下来是模板匹配多个对象。


import cv2  # 导入库
import numpy as np

'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('24.jpg')
'''
两个拼接数组的方法:
np.vstack():在竖直方向上堆叠
np.hstack():在水平方向上平铺
'''
img = np.hstack((img, img))
img1 = cv2.imread('25.PNG')
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img1', img1)

'''
    cv2.matchTemplate(image, templ, method, result, mask)
    模板匹配
# image: 待搜索图像(大图) templ: 搜索模板, 需和原图一样的数据类型且尺寸不能大于源图像
# result: 比较结果的映射图像, 其必须为单通道, 32位浮点型图像, 如果原图(待搜索
# 图像)尺寸为W x H, 而templ尺寸为 w x h, 则result尺寸一定是(W-w+1)x(H-h+1)
# method: 指定的匹配方法, 有如下6种:
# cv2.TM_SQDIFF ------平方差匹配法(最好匹配0)
# cv2.TM_SQDIFF_NORMED ------归一化平方差匹配法(最好匹配0)
# cv2.TM_CCORR ------相关匹配法(最坏匹配0)
# cv2.TM_CCORR_NORMED ------归一化相关匹配法(最坏匹配0)
# cv2.TM_CCOEFF ------系数匹配法(最好匹配1)
# cv2.TM_CCOEFF_NORMED ------化相关系数匹配法(最好匹配1)
'''
res = cv2.matchTemplate(img, img1, cv2.TM_CCORR_NORMED)

threshold = 0.97  # 相似度阈值
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
    '''
        cv2.rectangle(img,pt1,pt2,color,thickness,lineType,shift)
    # 画矩形
    # img,被画矩形的图像  pt1、pt2矩形的左上角、右下角坐标
    # color,直线的颜色,BGR颜色  thickness,线的宽度,-1的时候表示填充矩形
    # lineType,有三种cv2.LINE_AA、cv2.LINE_4、cv2.LINE_8
    # cv2.LINE_AA抗锯齿,这种类型的线看起来平滑点
    # shift,坐标精确到小数点后第几位
    '''
    cv2.rectangle(img, pt, (pt[0] + img1.shape[1], pt[1] + img1.shape[0]), (0, 255, 0), 2)
cv2.imshow('img', img)
'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()

在这里插入图片描述
就先这样,遇到别的再补充。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值