当前位置:   article > 正文

python3 OpenCV匹配图像之模板匹配_opencv-python找与数字图像中的模板数字5

opencv-python找与数字图像中的模板数字5

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

  • 一、简介:

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

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

  • 二、读取与显示
  1. import cv2 #导入opencv库
  2. #读取一张图片,地址不能带中文
  3. '''
  4. 第二个参数,取值可为:
  5. cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道
  6. cv2.IMREAD_GRAYSCALE:读入灰度图片
  7. cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道(png有,jpg无)
  8. '''
  9. imgviewx=cv2.imread("0165_0024.jpg",cv2.IMREAD_COLOR)
  10. # imgviewx=cv2.imread("0165_0024.jpg")
  11. #显示图片,参数:(窗口标识字符串,imread读入的图像)
  12. cv2.imshow("img_window",imgviewx)
  13. #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
  14. cv2.waitKey(0)
  15. #销毁窗口,退出程序
  16. cv2.destroyAllWindows()

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

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

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  • 三 cv2.matchTemplate模板匹配和cv2.minMaxLoc()函数

matchTemplate 函数原型:

  1. cv2.matchTemplate(image, templ, method, result=None, mask=None)
  2. # image:待搜索图像
  3. # templ:模板图像
  4. # result:匹配结果
  5. # 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() 函数原型

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

具体看个例子:

  1. import numpy as np
  2. import cv2
  3. a=np.array([[2,3,4,5],[5,67,8,9],[1,3,4,5]])
  4. print(a)
  5. min_val,max_val,min_indx,max_indx=cv2.minMaxLoc(a)
  6. print(min_val,max_val,min_indx,max_indx)
  7. 输出结果:
  8. [[ 2 3 4 5]
  9. [ 5 67 8 9]
  10. [ 1 3 4 5]]
  11. 1.0 67.0 (0, 2) (1, 1)
  12. 说明这个矩阵a的最小值为1.0,索引为(02),最大值为67.0索引为(11

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

  1. import cv2 #导入opencv库
  2. # 图片不要使用中文
  3. img = cv2.imread('超级玛丽.jpg')
  4. template = cv2.imread('金币.jpg')
  5. h, w = template.shape[:2] # rows->h, cols->w
  6. print('高:',h,"宽:",w)
  7. # 相关系数匹配方法:cv2.TM_CCOEFF
  8. res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF)
  9. min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  10. left_top = max_loc # 左上角
  11. right_bottom = (left_top[0] + w, left_top[1] + h) # 右下角
  12. cv2.rectangle(img, left_top, right_bottom, 255, 2) # 画出矩形位置
  13. #显示图片,参数:(窗口标识字符串,imread读入的图像)
  14. cv2.imshow("img_window",img)
  15. #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
  16. cv2.waitKey(0)
  17. #销毁窗口,退出程序
  18. cv2.destroyAllWindows()

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/923695
推荐阅读
相关标签
  

闽ICP备14008679号