python 使用模版匹配

本文详细介绍了如何使用Python进行模板匹配,通过实例展示了如何在图像中查找并定位源图片中的目标模板。从导入模块到结果展示,包括ImageMatch类的创建、match函数的实现以及关键点的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python 使用模版匹配

1.导入python及其他模块

import cv2
from matplotlib import pyplot as plt

2主程序

if  __name__=="__main__":
    src=r'D:\mypython\chengjiao\2.jpg'
    srctempl=r'D:\mypython\chengjiao\T1.jpg'
    imageMatch=ImageMatch(src,srctempl)
    X,Y=ImageMatch.main(imageMatch)
    print(X,Y)
    input("任意键结束:")
    # main()
    pass

3.建立ImageMatch类

class ImageMatch:
	 def __init__(self,Src,Srctempl):
        self.src=Src
        self.srctempl=Srctempl

4.类中的主运行函数

def main(self):
        # src=r'D:\mypython\chengjiao\2.jpg'
        # srctempl=r'D:\mypython\chengjiao\T1.jpg'
        result,imagebase,imagetempl=self.match(self.src, self.srctempl)
        X,Y=self.GetPoint(result,imagebase,imagetempl)
        return X,Y  

6.使用matplotlib 来显示图像

   def show(self,image, name):
        # plt.subplot(121)
        plt.title(name)
        plt.imshow(image)
        plt.axis('off')
        plt.show()

7.获取匹配结果

  def match(self,src,srctempl):
        method=5#cv::TM_CCOEFF_NORMED = 5 标准相关匹配 
        imagebase=cv2.imread(src)
        #self.show(imagebase ,"imagebase")  
        # imagetempl = imagebase[15:137,134:183].copy() 
        imagetempl=cv2.imread(srctempl)
        #self.show(imagetempl ,"imagetempl")  
        print('imagetempl.shape:',imagetempl.shape)
        shape=imagetempl.shape
        result=cv2.matchTemplate(imagebase,imagetempl,method)
        print('result.shape:',result.shape)
        print('result.dtype:',result.dtype)
        return result,imagebase,imagetempl

8.获取匹配结果

  #计算中心点位置
    def GetPoint(self,result,imagebase,imagetempl):
        method=5
        min_max = cv2.minMaxLoc(result)
        if method == 0 or method == 1:   #根据不同的模式最佳匹配位置取值方法不同
            match_loc = min_max[2]
        else:
            match_loc = min_max[3] 
        right_bottom = (match_loc[0] + imagetempl.shape[1], match_loc[1] + imagetempl.shape[0])
        print('result.min_max:',min_max,'method=',method)
        # print('match_loc:',match_loc,type(match_loc))
        # print('right_bottom',right_bottom,type(right_bottom))
        #self.show(imagebase ,"imagebase ") 
        X=int(match_loc[0])+int((right_bottom[0]-match_loc[0])/2)
        Y=int(match_loc[1])+int((right_bottom[1]-match_loc[1])/2)
        print(X,Y)
        if method==5 and float(min_max[1])< 0.5:
            X=0
            Y=0
            #标注位置
        img_disp = imagebase.copy()
        cv2.rectangle(img_disp, match_loc,right_bottom, (0,255,0), 5, 8, 0 )
        cv2.normalize( result, result, 0, 255, cv2.NORM_MINMAX, -1 )
        cv2.circle(result, match_loc, 10, (255,0,0), 2 )
        self.show(img_disp ,"img_disp ")
        return X,Y

9.运行效果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a7660331a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值