python3 opencv 模板匹配_【OpenCV】Python版模板匹配

模板匹配

模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.通过目标图片在待匹配图片进行遍历,通过选择一定的匹配方式能够得到每个起始像素点的匹配值,最终匹配值最大的位置就是候选匹配位置,也就达到了匹配查找的效果。

本例是通过鼠标选取图像中的一块矩形区域,遍历原图像后得到一个匹配值矩阵,将矩阵转换成0-255的灰度图像形式显示出来,实验结果图如下

完整源代码:

#decoding:utf-8 #!/usr/bin/env python import numpy as np from math import * import sys import os import glob import argparse import cv2 as cv drag_start = None#全局变量取方块鼠标拖拽时使用 sel = (0,0,0,0)#全局变量 长方形左上颌右下定点坐标存储 def onmouse(event, x, y, flags, param):#鼠标事件响应函数 global drag_start, sel if event == cv.EVENT_LBUTTONDOWN:#左键按下时记录当前初始坐标,并初始化矩形sel drag_start = x, y sel = 0,0,0,0 elif event == cv.EVENT_LBUTTONUP:#鼠标左键叹弹起时响应 if sel[2] > sel[0] and sel[3] > sel[1]:#判断右下角坐标是否大于左上角 patch = gray[sel[1]:sel[3],sel[0]:sel[2]]#取矩形区域内像素作为patch图像 result = cv.matchTemplate(gray,patch,cv.TM_CCOEFF_NORMED) result = np.abs(result)**3 val, result = cv.threshold(result, 0.01, 0, cv.THRESH_TOZERO)#将低于0。01的值赋值为0 result8 = cv.normalize(result,None,0,255,cv.NORM_MINMAX,cv.CV_8U)#将result转化到0-255区间 cv.imshow("result", result8) drag_start = None elif drag_start: #print flags if flags & cv.EVENT_FLAG_LBUTTON:#取当前坐标与初始坐标较小的为矩形坐标左上,较大的为右下 minpos = min(drag_start[0], x), min(drag_start[1], y) maxpos = max(drag_start[0], x), max(drag_start[1], y) sel = minpos[0], minpos[1], maxpos[0], maxpos[1] img = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) cv.rectangle(img, (sel[0], sel[1]), (sel[2], sel[3]), (0,255,255), 1) cv.imshow("gray", img) else: print "selection is complete" drag_start = None if __name__ == '__main__': parser = argparse.ArgumentParser(description='Demonstrate mouse interaction with images') parser.add_argument("-i","--input", default='../', help="Input directory.") args = parser.parse_args() path = args.input#获取图像路径参数 cv.namedWindow("gray",1) cv.setMouseCallback("gray", onmouse) '''''Loop through all the images in the directory''' for infile in glob.glob( os.path.join(path, '*.*') ):#遍历文件夹下的图片文件 ext = os.path.splitext(infile)[1][1:] #get the filename extenstion if ext == "png" or ext == "jpg" or ext == "bmp" or ext == "tiff" or ext == "pbm": print infile img=cv.imread(infile,1) if img == None: continue sel = (0,0,0,0) drag_start = None gray=cv.cvtColor(img, cv.COLOR_BGR2GRAY) cv.imshow("gray",gray) if (cv.waitKey() & 255) == 27: break cv.destroyAllWindows()

=========================================================

本文转载自:CSDN博客

欢迎加入我爱机器学习QQ14群:336582044

微信扫一扫,关注我爱机器学习公众号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值