前言:本文是我在学习opencv时记录的笔记,内容较为简洁,会记录从入门到做项目这段时间的内容,最终目的是完成我的毕业设计,欢迎大家给予批评指正。本篇为第一本书《Python-OpenCV从入门到精通》的笔记。
第十章 模板匹配
1.模板匹配方法
result = cv2.matchTemplate(image, templ, method, mask)
image:原始图像;
templ:模板图像;
method:方法;
参数值 | 值 | 含义 |
---|---|---|
cv2.TM_SQDIFF | 0 | 差值平方和匹配(差异程度,匹配度越高,计算结果越小,完全匹配为0) |
cv2.TM_SQDIFF_NORMED | 1 | 标准差值平方和匹配 |
cv2.TM_CCORR | 2 | 相关匹配(相似程度,匹配度越高,计算结果越大) |
cv2.TM_CCORR_NORMED | 3 | 标准相关匹配 |
cv2.TM_CCOEFF | 4 | 相关系数匹配(相似程度,计算结果为-1~1的浮点数,1表示完全匹配,0表示毫无关系,-1表示2张图片亮度刚好相反) |
cv2.TM_CCOEFF_NORMED | 5 | 标准相关系数匹配 |
mask:掩模,只有cv2.TM_SQDIFF和cv2.TM_CCORR_NORMED支持此参数;
result:计算得出的匹配结果。原始图像宽W、高H,模板图像宽w、高h,result就是一个W-w+1列、H-h+1行的32位浮点型数组。数组中每一个浮点数都是原始图像中对应像素位置的匹配结果,其含义需要根据method参数来解读。
2.单模板匹配-单目标
minMaxLoc()方法用来解析在matchTemplate()方法中计算得出的二维数组的最大值、最小值以及这2个值对应的坐标。
minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(src, mask)
src:matchTemplate()方法得出的数组;
mask:掩模,用默认值;
minValue:数组中的最小值;
maxValue:数组中的最大值;
minLoc:最小值的坐标,(x,y);
maxLoc:最大值的坐标。
# 单目标匹配
import cv2
# 获取图像和模板
img = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/01/background.jpg")
templ = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/01/template.png")
# 获取模板的高、宽和通道数
height, width, c = templ.shape
# 按照标准平方差方式匹配
result = cv2.matchTemplate(img, templ, cv2.TM_SQDIFF_NORMED)
# 获取匹配结果
minValue, maxValue, minLoc, maxLoc = cv2.minMaxLoc(result)
resultPoint1 = minLoc
# 计算最佳匹配区域右下角的坐标
resultPoint2 = (resultPoint1[0] + width, resultPoint1[1] + height)
# 绘制矩形
img = cv2.rectangle(img, resultPoint1, resultPoint2, (255, 255, 0), 5)
cv2.imshow("img", img)
cv2.imshow("tem",templ)
cv2.waitKey()
cv2.destroyAllWindows()
3.单模板匹配-多目标
用 for遍历单目标。
# 多目标匹配
import cv2
# 获取图像和模板
img = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/04/background2.jpg")
templ = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/04/template.png")
# 获取模板的高、宽和通道数
height, width, c = templ.shape
# 按照标准相关系数匹配
result = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)
# 遍历二维数组,找到所有匹配上的结果
for y in range(len(result)):
for x in range(len(result[y])):
if result[y, x] > 0.99: # 如果相关系数大于0.99
img = cv2.rectangle(img, (x, y), (x + width, y + height), (0, 0, 0), 3)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
4.多模板匹配
用for遍历单模板。
# 多模板匹配
import cv2
def resultTemplate(img, templ):
# 获取模板的高、宽和通道数
height, width, c = templ.shape
# 按照标准相关系数匹配
result = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)
loc = list() # 红框的坐标列表,记录匹配成功目标的左上角和右下角坐标
# 遍历二维数组,找到所有匹配上的结果
for y in range(len(result)):
for x in range(len(result[y])):
if result[y, x] > 0.99: # 如果相关系数大于0.99
loc.append((x, y, x + width, y + height))
return loc
# 获取图像和模板
img = cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/07/background2.jpg")
templs = list() # 模板列表
templs.append(cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/07/template.png"))
templs.append(cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/07/template2.png"))
templs.append(cv2.imread("D:/1a.study/opencv/Python OpenCV/sl/10/07/template3.png"))
loc = list()
for t in templs:# 记录坐标
loc += resultTemplate(img, t)
for i in loc: # 绘制矩形
img = cv2.rectangle(img, (i[0], i[1]), (i[2], i[3]), (0, 0, 0), 4)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
第十一章 滤波器
1.均值滤波器(低通滤波器)
以一个像素为核心,周围像素组成n×n的矩阵,这样的结构称为“滤波核”。
均值滤波器把每一个像素都当成滤波核的核心,计算核内所有像素的平均值,最后让核心像素值等于这个平均值。
dst = cv2.blur(src, ksize, anchor, borderType)
src:被处理的图像;
ksize:滤波核的大小,格式为(高度,宽度),建议使用奇数边长;
anchor:滤波核的锚点,建议采用默认值;
borderType:边界样式,建议采用默认值;
dst:处理后的图像。
2.中值滤波器
原理与均值滤波器相似,但不是计算平均值,而是取中值赋给核心像素。
中值滤波处理会比均值滤波处理丢失更多图像的细节。
dst = cv2.medianBlur(src, ksize)
src:被处理的图像;
ksize:滤波核的边长,必须是奇数。
3.高斯滤波器
又称高斯模糊或高斯平滑。越靠近核心的像素权重越大,要从权重大的图像中获取较多的信息。
进行高斯滤波的过程中,滤波核中像素与卷积核进行卷积计算,即滤波核中每个像素值都与卷积核对应位置的权重值相乘,最后计算出的值相加在四舍五入取整,最后得到的结果就是高斯滤波下滤波核的核心像素值。高斯滤波处理的图像更加平滑,保留的图像信息更多。
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
src:被处理的图像;
ksize:滤波核的大小,宽高必须是奇数;
sigmaX:卷积核水平方向的标准差;
sigmaY:卷积核垂直方向的标准差,修改sigmaX核sigmaY的值可以改变卷积核中的权重比例,若都为0,则会根据滤波核的大小自动计算合适的权重比例;
borderType:边界样式,使用默认值;
dst:处理后的图像。
4.双边滤波器
双边滤波是一种在平滑处理过程中可以有效保护边界信息的滤波操作方法。
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
src:被处理的图像;
d:以当前像素为中心的整个滤波区域的直径,如果d<0,则自动根据sigmaSpace参数计算得到,该值与保留的边缘信息数量成正比,与方法运行效率成反比;
sigmaColor:参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值,只有颜色值之差小于这个值时,周围的像素才进行滤波计算。值位255时,表示所有颜色都参与计算;
sigmaSpace:坐标空间的σ值,该值越大,参与计算的像素数量就越多;
borderType:边界样式。
# 均值滤波
img1 = cv2.blur(img, (5, 5))
cv2.imshow("blur", img1)
# 中值滤波
img2 = cv2.medianBlur(img, 5)
cv2.imshow("medianblur", img2)
# 高斯滤波
img3 = cv2.GaussianBlur(img, (5, 5), 0, 0)
cv2.imshow("Gaussianblur", img3)
# 双边滤波
img4 = cv2.bilateralFilter(img, 20, 120, 100)
cv2.imshow("bilateralFilter", img4)
第十二章 腐蚀与膨胀
第十三章 图形检测
暂略
第十四章 视频处理
1.读取并显示摄像头视频
VideoCapture类:用于完成摄像头的初始化工作。
capture = cv2.VideoCapture(index)
capture:要打开的摄像头;
index:摄像头的设备索引,0:打开笔记本内置摄像头,1:打开一个外置摄像头。
- 检验摄像头是否初始化成功:
retval = cv2.VideoCapture.isOpened()
简写为:retval = capture.isOpened()
retval:值位True,初始化成功。 - 读取帧:
retval, image = cv2.VideoCapture.read()
简写为:retval, image = capture.read()
retval:是否读取到帧;image:读取到的帧。 - 关闭摄像头:
cv2.VideoCapture.release()
简写为 capture.release()
例如:读取并显示摄像头视频
import cv2
capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本摄像头
while(capture.isOpened()):
retval, image = capture.read() # 实时读取视频
cv2.imshow("video", image)
key = cv2.waitKey(1)
if key == 32: # 如果按下空格键
break
capture.release() # 关闭摄像头
cv2.destroyAllWindows()
2.播放视频文件
capture = cv2.VideoCapture(filename)
filename:要打开的视频;
index:打开视频的文件名。