赞
踩
本文仅做为本人学习记录。
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)
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()
自己运行一下吧。这里只能匹配到一个金币。下一节我们讲如何匹配全部金币。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。