python3 opencv 模板匹配_python3 OpenCV匹配图像之模板匹配

本文仅做为本人学习记录。

一、简介:

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

今天我们就是用python学习OpenCV。

二、读取与显示import cv2 #导入opencv库

#读取一张图片,地址不能带中文

'''

第二个参数,取值可为:

cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道

cv2.IMREAD_GRAYSCALE:读入灰度图片

cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道(png有,jpg无)

'''

imgviewx=cv2.imread("0165_0024.jpg",cv2.IMREAD_COLOR)

# imgviewx=cv2.imread("0165_0024.jpg")

#显示图片,参数:(窗口标识字符串,imread读入的图像)

cv2.imshow("img_window",imgviewx)

#窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数

cv2.waitKey(0)

#销毁窗口,退出程序

cv2.destroyAllWindows()

这里有一点需要注意,OpenCV中的默认颜色格式通常称为RGB,但实际上是BGR(字节是相反的)。

如果使用特征匹配等算法的时候就需要转换。如下:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

三 cv2.matchTemplate模板匹配和cv2.minMaxLoc()函数

matchTemplate 函数原型:

cv2.matchTemplate(image, templ, method, result=None, mask=None)

# image:待搜索图像

# templ:模板图像

# result:匹配结果

# method:计算匹配程度的方法

关于匹配方法,使用不同的方法产生的结果的意义可能不太一样,有些返回的值越大表示匹配程度越好,而有些方法返回的值越小表示匹配程度越好。

关于参数 method:

CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。

CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。

CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。

CV_TM_SQDIFF_NORMED 归一化平方差匹配法

CV_TM_CCORR_NORMED 归一化相关匹配法

CV_TM_CCOEFF_NORMED 归一化相关系数匹配法

cv2.minMaxLoc() 函数原型

cv2.minMaxLoc(src, mask=None)

#src是一个矩阵。

函数功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。咋一看感觉很复杂,但使用这个cv2.minMaxLoc()函数就可全部解决。函数返回的四个值就是上述所要得到的。

具体看个例子:

import numpy as np

import cv2

a=np.array([[2,3,4,5],[5,67,8,9],[1,3,4,5]])

print(a)

min_val,max_val,min_indx,max_indx=cv2.minMaxLoc(a)

print(min_val,max_val,min_indx,max_indx)

输出结果:

[[ 2 3 4 5]

[ 5 67 8 9]

[ 1 3 4 5]]

1.0 67.0 (0, 2) (1, 1)

说明这个矩阵a的最小值为1.0,索引为(0,2),最大值为67.0索引为(1,1)

讲了这么多理论知识接下来我们来实战一下吧。

import cv2 #导入opencv库

# 图片不要使用中文

img = cv2.imread('超级玛丽.jpg')

template = cv2.imread('金币.jpg')

h, w = template.shape[:2] # rows->h, cols->w

print('高:',h,"宽:",w)

# 相关系数匹配方法:cv2.TM_CCOEFF

res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

left_top = max_loc # 左上角

right_bottom = (left_top[0] + w, left_top[1] + h) # 右下角

cv2.rectangle(img, left_top, right_bottom, 255, 2) # 画出矩形位置

#显示图片,参数:(窗口标识字符串,imread读入的图像)

cv2.imshow("img_window",img)

#窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数

cv2.waitKey(0)

#销毁窗口,退出程序

cv2.destroyAllWindows()

自己运行一下吧。这里只能匹配到一个金币。下一节我们讲如何匹配全部金币。

你可能感兴趣的:(python3,opencv,模板匹配)