Python OpenCV从入门到精通
🐍 Python与OpenCV
1.1 Python概述
什么是Python
Python是一种当下热门的编程语言,因其语法简洁、功能强大而受到广泛欢迎。
Python的版本
Python有多个版本,其中Python 2和Python 3是最常用的。
Python的应用
Python广泛应用于多个领域,包括但不限于:
数据分析
人工智能
网络开发
自动化脚本
1.2 OpenCV概述
计算机视觉
计算机视觉是让计算机理解和处理图像的技术,OpenCV是一个开源的计算机视觉库,专为开发人员提供了简便的图像处理工具。
OpenCV包含的模块
OpenCV包含多个模块,主要有:
图像处理模块
视频分析模块
特征检测模块
OpenCV的发展历程
自2009年以来,OpenCV经历了多个重要版本的更新,不断增加新的功能和优化性能。
OpenCV的应用
OpenCV被广泛应用于:
人脸识别
物体检测
图像拼接
Python OpenCV的开发工具
使用Python进行OpenCV开发时,主要依赖以下两个库:
OpenCV-Contrib-Python库
Numpy库
小结
本章讨论了Python及其版本、应用,计算机视觉的概念,OpenCV的模块和发展历程,以及Python OpenCV的优势。学习本章后,读者应掌握Python OpenCV常用的两个库:OpenCV-Contrib-Python库和Numpy库。
🛠️ 搭建开发环境
- 开发工具介绍
本章介绍了以下开发工具的下载和安装:
Python解释器
OpenCV-Contrib-Python库
Numpy库
集成开发工具PyCharm
“使用这些开发工具前,需先对它们进行下载和安装。”
-
Python的下载和安装
2.1 下载和安装步骤
下载Python
安装Python
测试Python是否安装成功
2.2 安装过程示例
打开Python官网下载页面
选择适合Windows的Python版本进行下载
跟随安装向导进行安装,注意选择安装选项和高级选项
2.3 测试安装
在命令提示符窗口中输入python,若出现版本信息,则表示安装成功。 -
OpenCV-Contrib-Python的下载和安装
3.1 下载和安装步骤
下载OpenCV-Contrib-Python库
测试OpenCV-Contrib-Python库和Numpy库是否安装成功
3.2 使用pip命令安装
在命令提示符中输入以下命令:
bash
Copy
pip install opencv-contrib-python
pip install numpy
4. PyCharm的下载和安装
4.1 下载和安装步骤
下载PyCharm
安装PyCharm
启动并配置PyCharm
4.2 安装过程示例
打开PyCharm官网下载页面
下载完成后,运行安装文件
更改安装路径、设置快捷方式和关联文件
4.3 启动PyCharm
接受PyCharm协议
设置项目路径及虚拟环境路径
5. 配置OpenCV-Contrib-Python库和Numpy库
5.1 新建.py文件
在PyCharm中新建一个.py文件,输入文件名。
5.2 导入库
输入import cv2时,如果出现错误,请打开Settings对话框。
5.3 项目解释器设置
单击Project Interpreter
选择并单击Add
输入python.exe的存储位置
5.4 成功添加库
确保OpenCV-Contrib-Python库和Numpy库成功添加。
- 小结
本章介绍了以下内容:
内容 说明
Python下载和安装 下载标记为executable installer的Python压缩包
使用pip命令下载库 安装OpenCV-Contrib-Python库和Numpy库
PyCharm配置 将OpenCV-Contrib-Python库和Numpy库配置到PyCharm中
🖼️ 图像处理的基本操作
- 图像处理的基本操作
“OpenCV的作用在于让开发人员更容易地通过编码来处理图像。图像处理的基本操作包含4个方面的内容:读取图像、显示图像、保存图像和获取图像属性。”
4个基本操作
操作 描述
读取图像 使用 imread() 方法读取图像文件。
显示图像 使用 cv2.imshow() 方法在窗口中显示图像。
保存图像 使用 cv2.imwrite() 方法保存处理后的图像。
获取图像属性 获取图像的 shape、size 和 dtype 属性。
2. 常用图像属性
3个常用属性
属性名称 描述
shape 图像的维度信息,包括高度、宽度和通道数。
size 图像的总像素数,即高乘以宽。
dtype 图像数据类型,如 uint8 等。
3. 读取图像
方法
使用 cv2.imread() 方法读取图像文件。
通过更改参数,读取到的图像可以是彩色图像或灰度图像。
示例代码
python
Copy
import cv2
读取彩色图像
image_color = cv2.imread(‘D:/3.1.jpg’)
读取灰度图像
image_gray = cv2.imread(‘D:/3.1.jpg’, cv2.IMREAD_GRAYSCALE)
4. 显示图像
方法
使用 cv2.imshow() 方法显示图像。
需要在 cv2.imshow() 方法后紧跟 cv2.waitKey() 方法,以确保图像窗口正常显示。
示例代码
python
Copy
cv2.imshow(‘Image’, image_color)
cv2.waitKey(0) # 等待用户按键
cv2.destroyAllWindows() # 关闭所有窗口
5. 保存图像
方法
使用 cv2.imwrite() 方法保存图像。
示例代码
python
Copy
cv2.imwrite(‘D:/Pictures/1.jpg’, image_color)
6. 获取图像属性
方法
通过属性访问获取并打印图像的 shape、size 和 dtype。
示例代码
python
Copy
print(“图像的形状:”, image_color.shape)
print(“图像的大小:”, image_color.size)
print(“图像的数据类型:”, image_color.dtype)
7. 注意事项
“在进行图像处理的基本操作时,要注意以下3个问题:”
图像类型:通过更改参数,imread() 方法读取到的图像既可以是一幅彩色图像,也可以是一幅灰度图像。
窗口显示:为了能够正常显示图像,cv2.imshow() 方法后必须紧跟着 cv2.waitKey() 方法。
路径名:在声明路径名时,“/”和“\”的作用是等价的(例如,D:/3.1.jpg 等价于 D:\3.1.jpg)。
🌟 第4章 像素的操作
📏 像素的定义
“像素是图像的最小单位。每一幅图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。”
灰度图像:计算机通常把灰度图像的像素处理为256个灰度级别,使用区间
KaTeX can only parse string typed expression
[0,255] 中的整数数值表示。
0:表示纯黑色
255:表示纯白色
📊 像素操作
4.1 像素的主要操作
确定像素的位置
获取像素的BGR值
修改像素的BGR值
示例图
图4.1:显示花朵的图像
提取并放大图4.1中被圆圈圈住的区域
📐 坐标系
水平和垂直方向的坐标系
根据图4.1在水平方向和垂直方向的像素绘制坐标系。
像素值示例
**坐标(291, 218)**上的像素的像素值。
🛠️ 使用NumPy模块操作像素
4.2 NumPy概述
NumPy是一个用于处理数组的Python库,主要功能包括:
数组的类型
创建数组
操作数组
数组的索引和切片
创建图像
拼接图像
数组操作示例
数组加法运算示意图
数组减法和乘除法运算示意图
数组幂运算示意图
切片式索引示意图
反向索引示意图
二维数组索引示意图
二维数组切片式索引示意图
🖼️ 创建图像
图像示例
图像类型 描述
纯黑图像 宽200、高100的纯黑图像
纯白图像 宽200、高100的纯白图像
黑色内部白色矩形 在黑色图像内部绘制白色矩形
黑白相间图像 黑白相间的图像
纯蓝图像 纯蓝图像
纯绿图像 纯绿图像
纯红图像 纯红图像
随机黑白图像 随机生成的黑白图像
随机彩色图像 随机生成的彩色图像
🔗 图像拼接
拼接示例
水平拼接:将两个数组水平拼接
垂直拼接:将两个数组垂直拼接
拼接效果示意图
拼接方式 效果
水平拼接 水平拼接的效果
垂直拼接 垂直拼接的效果
📝 小结
“本章详细讲解了像素和使用NumPy模块操作像素两个方面的内容。”
关键要点
表示图像某一个像素的坐标的正确方式是(垂直像素,水平像素)。
在OpenCV中,彩色图像的通道顺序是B→G→R。
重点掌握且灵活运用NumPy模块实现图像的创建和图像的拼接。
🎨 色彩空间与通道
5.1 色彩空间
色彩的定义
色彩是人类的眼睛对于不同频率的光线的不同感受,不同频率的光线既是客观存在的又是人类主观感知的。
为了表示这些不同频率的光线的色彩,人类建立了多种色彩模型,把这些色彩模型称作色彩空间。在 OpenCV 中,BGR(蓝-绿-红)色彩空间有三个通道:
B通道:表示蓝色
G通道:表示绿色
R通道:表示红色
常见的色彩空间
色彩空间类型 描述
GRAY 灰度色彩空间
HSV 色相-饱和度-明度色彩空间
5.2 通道
通道的处理
拆分通道:将彩色图像的通道分开,便于单独处理。
合并通道:将多个通道合并成一幅彩色图像。
综合运用拆分通道和合并通道:灵活处理图像的不同通道。
alpha 通道
alpha 通道用于设置图像的透明度。调整 alpha 通道的值后,可以改变图像的透明效果。
拆分和合并通道的效果
拆分 BGR 图像中通道的效果:
每个通道(B、G、R)单独显示。
拆分 HSV 图像中通道的效果:
显示 H(色相)、S(饱和度)、V(明度)三个通道。
示例:合并通道后的效果
操作 描述
按 B→G→R 的顺序合并通道 合并后重新组成的图像
合并 H、S、V 通道图像 形成新的图像表现
5.3 小结
转换色彩空间的注意事项
当使用 cvtColor() 方法转换色彩空间时,需注意以下几点:
彩色图像能够转换为灰度图像,但灰度图像不能转换为彩色图像。
在 HSV 色彩空间中,保持其中两个通道的值不变,调整第 3 个通道的值,会得到相应的艺术效果。
为了能够显示艺术效果,需把合并通道后的图像从 HSV 色彩空间转换到 BGR 色彩空间。
使用 alpha 通道设置图像的透明度时,为了能够直观地看到图像的透明效果,需先保存已经设置透明度的图像。
🎨 绘制图形和文字
6.1 线段的绘制
绘制线段并拼成一个“王”字
可以使用OpenCV的line()方法绘制线段。
需定义每条线段的起点坐标和终点坐标。
示例
将黑色背景替换为白色背景。
6.2 矩形的绘制
绘制矩形边框
使用rectangle()方法绘制矩形的边框。
绘制实心矩形
使用rectangle()方法绘制填充的矩形。
绘制正方形
通过设置相同的长宽值来绘制正方形。
6.3 圆形的绘制
绘制“交通灯”
使用circle()方法绘制多个圆形,模拟交通灯的效果。
绘制同心圆
可以使用circle()方法绘制多个同心圆。
绘制随机实心圆
可以使用循环生成多个随机位置的实心圆。
6.4 多边形的绘制
绘制等腰梯形边框
使用polylines()方法绘制多边形的边框。
不按顺时针或逆时针给出顶点的坐标
如果不按顺序给出顶点,可能会导致绘制效果不如预期。
绘制不闭合的等腰梯形边框
使用polylines()方法也可以绘制不闭合的多边形。
6.5 文字的绘制
字体样式及其含义
字体样式 含义
FONT_HERSHEY_SIMPLEX 正常大小的sans-serif字体
FONT_HERSHEY_PLAIN 小号的sans-serif字体
FONT_HERSHEY_DUPLEX 正常大小的sans-serif字体(更复杂)
FONT_HERSHEY_COMPLEX 正常大小的serif字体
FONT_HERSHEY_TRIPLEX 正常大小的serif字体(更复杂)
FONT_HERSHEY_COMPLEX_SMALL FONT_HERSHEY_COMPLEX字体的简化版
FONT_HERSHEY_SCRIPT_SIMPLEX 手写风格的字体
FONT_HERSHEY_SCRIPT_COMPLEX FONT_HERSHEY_SCRIPT_SIMPLEX的进阶版
FONT_ITALIC 斜体
绘制文字“mrsoft”
使用putText()方法在图像上绘制文字。
处理中文乱码
在绘制中文时可能出现乱码,需要设置合适的字体。
字体样式变化效果
不同的字体样式会影响文本的显示效果。
文字的斜体效果
可以通过设置字体样式为FONT_ITALIC实现斜体效果。
绘制垂直镜像效果的文字
可以通过图像变换实现文字的垂直镜像效果。
6.6 动态绘制图形
小球在四个方向的速度
可以设定小球在四个方向的速度,模拟动态效果。
小球的移动轨迹
通过不断更新小球的位置来绘制其运动轨迹。
6.7 小结
绘制图形和文字需要先创建画布,画布可以是一幅图像。
确定线条的颜色时,要特别注意颜色的表示方式,即(B, G, R)。
绘制矩形、圆形和多边形时,可以通过设置线条宽度来绘制图形的边框或填充的图形。
在绘制多边形时,需按照顺时针或逆时针方向标记各个顶点的坐标。
OpenCV提供的方法不仅可以绘制静态图形,还支持动态绘制效果。
📷 第7章 图像的几何变换
几何变换概述
“几何变换是指改变图像的几何结构,例如大小、角度和形状等,让图像呈现出缩放、翻转、映射和透视效果。这些几何变换操作都涉及复杂、精密的计算,OpenCV将这些计算过程封装成非常灵活的方法,开发者只需修改一些参数,就能实现图像的变换效果。”
7.1 缩放
缩放方法
dsize参数:通过设置该参数来实现图像的缩放效果。
fx和fy参数:通过设置这两个参数(分别代表横向和纵向的缩放因子)来进行缩放。
缩放效果示例
参数 效果描述
dsize 直接设置缩放后的图像大小
fx 横向缩放因子
fy 纵向缩放因子
7.2 翻转
翻转效果
沿X轴翻转:图像在X轴方向上的翻转。
沿Y轴翻转:图像在Y轴方向上的翻转。
flipCode类型值及含义
类类型值 含义
0 沿X轴翻转
正数 沿Y轴翻转
负数 同时沿X轴、Y轴翻转
3种翻转效果
沿X轴翻转:图像上下翻转。
沿Y轴翻转:图像左右翻转。
同时沿X轴和Y轴翻转:图像呈现180度翻转效果。
7.3 仿射变换
仿射变换类型
平移:图像在某一方向上移动。
旋转:图像围绕某一点旋转。
倾斜:图像发生倾斜变形。
常见的仿射变换效果
操作 效果描述
向右下方平移 图像整体向右下方移动
纵坐标上移50像素 图像向上移动50像素
横坐标左移200像素 图像向左移动200像素
逆时针旋转 图像沿中心点逆时针旋转
7.4 透视变换
透视效果
从图像底部观察:图像呈现出底部视角的透视效果。
人眼观察透视:模拟人眼观察图像的透视效果。
通过4个点定位:利用四个点来实现图像的透视变换。
小结
“图像的缩放有2种方式:一种是设置dsize参数,另一种是设置fx参数和fy参数。图像的翻转有3种方式,沿X轴翻转、沿Y轴翻转和同时沿X轴、Y轴翻转,这3种方式均由flipCode参数的值决定。图像的仿射变换取决于仿射矩阵,采用不同的仿射矩阵(M),就会使图像呈现不同的仿射效果。此外,图像的透视仍然要依靠M矩阵实现。因此,读者只要熟练掌握并灵活运用M矩阵,就能够得心应手地对图像进行几何变换操作。”
📷 第8章 图像的阈值处理
阈值处理概述
“阈值是图像处理中一个很重要的概念,类似一个‘像素值的标准线’。所有像素值都与这条‘标准线’进行比较,最终得到三种结果:像素值比阈值大、像素值比阈值小或像素值等于阈值。”
阈值处理的主要目的是将图像的像素进行分组,增强图像的轮廓,使其更易于计算机或肉眼识别。
8.1 阈值处理函数
阈值处理类型
类型 含义
cv2.THRESH_BINARY 二值化阈值处理
cv2.THRESH_BINARY_INV 反二值化阈值处理
cv2.THRESH_TOZERO 低于阈值零处理
cv2.THRESH_TOZERO_INV 超出阈值零处理
cv2.THRESH_TRUNC 截断阈值处理
8.2 “非黑即白”的图像
二值化处理和反二值化处理是图像阈值处理中常见的两种类型。
8.3 零处理
零处理可以分为:
低于阈值零处理
超出阈值零处理
图像处理效果示例
处理类型 效果
低于阈值零处理 图像低于阈值零处理效果
超出阈值零处理 图像超出阈值零处理效果
8.4 截断处理
截断处理的效果展示了阈值处理的另一种形式。
8.5 自适应处理
自适应阈值的计算方法及其含义
计算方法 含义
cv2.ADAPTIVE_THRESH_MEAN_C 对一个正方形区域内的所有像素平均加权
cv2.ADAPTIVE_THRESH_GAUSSIAN_C 根据高斯函数对像素进行加权计算
处理结果示例
ADAPTIVE_THRESH_MEAN_C的处理结果
ADAPTIVE_THRESH_GAUSSIAN_C的处理结果
8.6 Otsu方法
Otsu方法用于处理亮度较高的图像,其效果展示了二值化处理的结果和实现Otsu方法的阈值处理的结果。
8.7 阈值处理的作用
阈值处理在图像处理中起到了关键作用,能够将彩色图像转变为黑白二值图像,但在处理灰度图像时,可能需要更复杂的阈值处理技术。
8.8 小结
“OpenCV提供了一个可以快速抠出图像主体线条的工具,这个工具就是阈值。在阈值的作用下,一幅彩色图像被转换为只有纯黑和纯白的二值图像。然而,灰度图像经过五种阈值处理类型处理后,无法得到图像主体的线条。为此,OpenCV提供了一种改进的阈值处理技术,即自适应处理,其关键在于对图像中的不同区域使用不同的阈值。”
🖼️ 图像的运算
9.1 掩模
掩模的定义
掩模是用于图像处理的一种工具,它可以遮盖图像的特定区域,从而对图像进行选择性处理。掩模通常由正整数(如0和255)表示。
掩模的应用实例
外科手术给患者使用的手术洞巾
原始图像和掩模的关系
原始图像:未经过滤的图像
掩模图像:对原始图像进行遮盖后的结果
掩模操作示例
被掩模覆盖后的图像
新掩模的效果
调换黑白区域后,得到的新掩模会影响最终图像的显示效果。
9.2 图像的加法运算
加法运算的基本概念
图像的加法运算是将两个或多个图像的对应像素值相加,生成新的像素值。
加法运算效果
图像相加生成新像素,产生新的视觉效果。
例如,蓝色和红色相加的结果可以展示新色彩。
代码示例
代码运行结果如图所示,展现了通过掩模进行相加的结果。
9.3 图像的位运算
位运算的种类
位运算是一种通过操作图像的二进制位来实现图像处理的技术,主要包括以下几种运算:
按位与运算:cv2.bitwise_and()
按位或运算:cv2.bitwise_or()
按位取反运算:cv2.bitwise_not()
按位异或运算:cv2.bitwise_xor()
位运算的应用
位运算可以用于图像的合并、遮罩以及加密等。
运算方法 含义
cv2.bitwise_and() 按位与
cv2.bitwise_or() 按位或
cv2.bitwise_not() 按位取反
cv2.bitwise_xor() 按位异或
位运算效果示例
图像做与运算、或运算、取反运算、异或运算的过程与效果展示。
9.4 合并图像
合并图像的方法
合并图像主要有两种方式:
加权和:将两幅图像按比例合成。
覆盖:将一幅图像覆盖在另一幅图像上。
合并图像的实例
例如,日落图像与沙滩图像的加权和效果,以及覆盖图像的效果。
9.5 小结
关于掩模的关键问题
读者需要明确以下三个问题:
0和255在掩模中各自发挥的作用
掩模的作用是什么
如何创建一个掩模
掌握掩模后,能够利用掩模遮盖图像相加后的结果。掩模的应用不仅限于图像加法运算,还广泛应用于位运算,例如对图像进行加密和解密。
第10章 模板匹配
📜 模板匹配概述
“模板匹配是一种最原始、最基本的识别方法,可以在原始图像中寻找特定图像的位置。模板匹配经常应用于简单的图像查找场景中,例如,在集体合照中找到某个人的位置。”
10.1 模板匹配方法
匹配方法的参数值
参数值 值 含义
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表示亮度相反。
cv2.TM_CCOEFF_NORMED 5 标准相关系数匹配,规则同上。
📊 模板在原始图像中移动并逐个匹配
模板和原始图像的宽、高
模板的尺寸将影响匹配结果,必须适当选择。
模板移动的范围
模板在原始图像中移动的范围需要根据原始图像的大小和模板的大小来决定。
10.2 单模板匹配
匹配类型
单目标匹配:只匹配一个模板与图像中的一个目标。
多目标匹配:在一个图像中匹配多个相同模板。
📸 模板匹配的效果
示例图像
展示模板与原始图像的匹配效果。
10.3 多模板匹配
模板的使用
在多模板匹配中,可以同时使用多个模板进行匹配,以提高识别率。
多模板匹配效果
多模板匹配的结果通常比单模板匹配更为准确,尤其在复杂背景下。
10.4 小结
“模板匹配包括单模板匹配和多模板匹配,单模板匹配又包括单目标匹配和多目标匹配。实现这些内容的基础方法就是模板匹配方法,即matchTemplate()方法。”
重点内容
模板匹配方法的6个参数值:需要重点掌握。
单目标匹配:需使用模板匹配方法matchTemplate()和minMaxLoc()方法,该方法返回单目标匹配的最优结果。
多目标匹配与多模板匹配的区别:
多目标匹配只有一个模板。
多模板匹配则有多个模板。
📊 第11章 滤波器
图像平滑处理
图像平滑处理(或图像模糊处理)是指在尽量保留原图像信息的情况下,去除图像内的噪声、降低细节层次信息的一系列过程。实现平滑处理最常用的工具就是滤波器。通过调节滤波器的参数,可以控制图像的平滑程度。OpenCV提供了种类丰富的滤波器,每种滤波器使用的算法均不同,但都能对图像中的像素值进行微调,让图像呈现平滑效果。
滤波器类型
滤波器类型 说明
均值滤波器 通过求取邻域像素的平均值来减少噪声。
中值滤波器 通过取邻域像素的中位数来减少噪声。
高斯滤波器 通过加权平均的方式,使用高斯函数来平滑图像。
双边滤波器 考虑空间距离和像素值差异的双重影响,保留边缘信息。
11.1 均值滤波器
噪声图像
噪声图像指的是图像内部的高亮度像素点,这些像素点被称为噪声。
3×3 的滤波核
均值滤波器通常使用的滤波核大小为3×3或5×5。以3×3的滤波核为例,其计算过程如下:
滤波核 计算公式
3×3核
KaTeX can only parse string typed expression
均值=
9
1
∑
i,j
I(i,j)
均值滤波的计算过程
均值滤波是通过对每个像素点及其邻域像素求平均值得到新的像素值,从而实现图像平滑。
图像均值滤波效果
均值滤波能够有效减少图像中的随机噪声,但可能会模糊图像细节。
11.2 中值滤波器
中值滤波的计算过程
中值滤波器对每个像素点取其邻域像素的中位数,能够更好地保留边缘信息。
图像中值滤波效果
中值滤波在去除噪声的同时,对图像边缘的保留效果优于均值滤波。
11.3 高斯滤波器
5×5 的高斯滤波卷积核的权重示意图
高斯滤波使用高斯分布函数来计算权重,滤波核的中心像素权重最大,周围像素权重逐渐减小。
简化的 3×3 的卷积核
卷积核 权重示意
3×3 高斯核
KaTeX can only parse string typed expression
16
1
16
2
16
1
16
2
16
4
16
2
16
1
16
2
16
1
像素与卷积核进行卷积计算
卷积操作是通过将卷积核与图像的像素进行加权求和来实现的。
图像的高斯滤波效果
高斯滤波能够有效平滑图像,同时尽量保留图像中的结构和细节。
11.4 双边滤波器
双边滤波器考虑了空间距离和像素值差异,这使得它在平滑图像的同时能够更好地保留边缘信息。
11.5 小结
噪声指的是一幅图像内部的高亮度像素点。图像平滑处理是指在尽量保留原图像信息的情况下,去除图像内部的这些高亮度的像素点(即“噪声”)。为了实现图像平滑处理,需要的工具就是滤波器。本章主要讲解了OpenCV中的4种滤波器,虽然每种滤波器的实现原理都不同,但是每种滤波器都能对图像进行图像平滑处理。
第12章 腐蚀与膨胀
🌟 概述
在图像处理的领域,腐蚀和膨胀是两种核心操作。通过合理使用这两种操作,可以清除或强化图像中的细节,并实现更复杂的图像运算,如开运算、闭运算、梯度运算、顶帽运算和黑帽运算等。
🧩 12.1 腐蚀
腐蚀操作
腐蚀是通过去除图像中某些像素来实现细节的清除。
原图像与腐蚀之后的效果对比可以清晰地展示腐蚀的作用。
示例图像
展示原图和腐蚀之后的图像,以便理解腐蚀的效果。
🧩 12.2 膨胀
膨胀操作
膨胀是通过填补图像中的像素来增强图像的细节。
图像膨胀操作的效果可以通过“近视眼”效果来展示。
示例图像
展示膨胀操作前后的效果。
🧩 12.3 开运算
开运算定义
开运算是对图像先进行腐蚀操作,再进行膨胀操作,其作用是抹除图像外部的细节。
示例图像
展示二叉树图像腐蚀之后的效果及对其进行膨胀操作后的效果。
🧩 12.4 闭运算
闭运算定义
闭运算是对图像先进行膨胀操作,再进行腐蚀操作,其作用是抹除图像内部的细节。
示例图像
展示闭运算在汉字图片上的效果。
🧩 12.5 形态学运算
形态学运算的类型
操作类型 含义
cv2.MORPH_ERODE 腐蚀操作
cv2.MORPH_DILATE 膨胀操作
cv2.MORPH_OPEN 开运算,先腐蚀后膨胀
cv2.MORPH_CLOSE 闭运算,先膨胀后腐蚀
cv2.MORPH_GRADIENT 梯度运算,膨胀图减腐蚀图
cv2.MORPH_TOPHAT 顶帽运算,原始图减开运算图
cv2.MORPH_BLACKHAT 黑帽运算,闭运算图减原始图
🧩 12.6 小结
本章介绍了基础的腐蚀和膨胀操作,开运算和闭运算分别用于抹除图像外部和内部的细节。此外,形态学运算构建在这两种操作的基础上,包括:
梯度运算:得到原图的轮廓。
顶帽运算:获取图像的外部细节。
黑帽运算:提取图像的内部细节。
📊 图形检测
图形检测的概述
“图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、圆形等。虽然图形检测涉及非常深奥的数学算法,但OpenCV已经将这些算法封装成简单的方法,开发者只要学会如何调用方法、调整参数即可很好地实现检测功能。”
13.1 图像的轮廓
轮廓的检索模式参数值
参数值 含义
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 检测所有轮廓,但不建立层次关系
cv2.RETR_CCOMP 检测所有轮廓,并建立两级层次关系
cv2.RETR_TREE 检测所有轮廓,并建立树状结构的层次关系
检测轮廓时使用的方法
参数值 含义
cv2.CHAIN_APPROX_NONE 储存轮廓上的所有点
cv2.CHAIN_APPROX_SIMPLE 只保存水平、垂直或对角线轮廓的端点
cv2.CHAIN_APPROX_TC89_L1 Ten-Chinl近似算法中的一种
cv2.CHAIN_APPROX_TC89_KCOS Ten-Chinl近似算法中的另一种
13.2 轮廓拟合
矩形包围框
圆形包围框
13.3 凸包
凸包的定义
“凸包是一个包含所有点的最小凸多边形。”
不是凸包的示例
“如果一个多边形的内部存在凹陷区域,则该多边形不是凸包。”
13.4 Canny边缘检测
边缘检测的结果示例
最小阈值为10、最大阈值为50的检测结果
最小阈值为100、最大阈值为200的检测结果
最小阈值为400、最大阈值为600的检测结果
13.5 霍夫变换
霍夫变换的应用
直线检测
圆环检测
13.6 小结
“图像轮廓指的是将图像的边缘连接起来形成的一个整体,它是图像的一个重要的特征信息。通过对图像的轮廓进行操作,能够得到这幅图像的大小、位置和方向等信息,用于后续的计算。为此,OpenCV提供了findContours()方法,通过计算图像的梯度,判断图像的轮廓。为了绘制图像的轮廓,OpenCV又提供了drawContours()方法。但需要注意的是,Canny()方法虽然能够检测出图像的边缘,但这个边缘是不连续的。”
📹 视频处理
14.1 读取并显示摄像头视频
VideoCapture类
用于捕获视频流,包括摄像头视频。
使用VideoCapture类
通过该类可以读取并显示实时摄像头视频。
摄像头可以是内置的或外置的。
摄像头视频显示
彩色视频与灰度视频
彩色视频:包含多个颜色通道。
灰度视频:仅包含亮度信息。
示例代码
python
Copy
import cv2
创建VideoCapture对象,参数为摄像头索引
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow(‘Camera’, frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
14.2 播放视频文件
读取并显示视频文件
示例:读取名为“公司宣传.avi”的视频文件。
视频的暂停与继续播放
使用cv2.waitKey()函数控制视频的暂停与继续。
获取视频文件属性
属性 含义
cv2.CAP_PROP_POS_MSEC 当前播放时间(毫秒)
cv2.CAP_PROP_POS_FRAMES 当前帧的索引,从0开始
cv2.CAP_PROP_FRAME_WIDTH 视频帧宽度
cv2.CAP_PROP_FRAME_HEIGHT 视频帧高度
cv2.CAP_PROP_FPS 帧速率(帧每秒)
cv2.CAP_PROP_FRAME_COUNT 视频总帧数
示例代码
python
Copy
import cv2
cap = cv2.VideoCapture(‘公司宣传.avi’)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
cv2.imshow(‘Video’, frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
14.3 保存视频文件
VideoWriter类
用于将处理后的视频保存到文件中。
常用的视频编码格式
fourcc值 视频编码格式 文件扩展名
cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’) 未压缩的YUV颜色编码格式 .avi
cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’) MPEG-1编码格式 .avi
cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’) MPEG-4编码格式 .avi
cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’) Ogg Vorbis编码格式 .ogv
cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘I’) Flash视频编码格式 .flv
示例代码
python
Copy
import cv2
fourcc = cv2.VideoWriter_fourcc(*‘XVID’)
out = cv2.VideoWriter(‘output.avi’, fourcc, 20.0, (640, 480))
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame)
cv2.imshow(‘Recording’, frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
14.4 小结
视频是由一系列连续的图像构成的,这些图像称为帧。
帧是以固定时间间隔从视频中获取的。
视频播放的速度即为帧速率,单位为帧/s(每秒出现的图像数)。
视频处理的对象是从视频中获取的帧,利用图像处理的方法对其进行处理。
👤 第15章 人脸检测和人脸识别
人脸识别概述
“人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,也是计算机视觉重点发展的技术。”
人脸识别技术的进步使得计算机能够通过摄像头等输入设备自动分析图像中包含的内容信息。随着技术的不断发展,目前已经有了多种人脸识别的算法。
15.1 人脸检测
级联分类器
级联分类器是一种用于分析人脸位置的方法。它通过逐级决策来判断某个区域是否包含人脸。
OpenCV 级联分类器 XML 文件
OpenCV 提供了一些预训练的级联分类器 XML 文件,常用的包括:
级联分类器 XML 文件名 检测的内容
haarcascade_eye.xml 眼睛检测
haarcascade_eye_tree_eyeglasses.xml 眼镜检测
haarcascade_frontalcatface.xml 正面猫脸检测
haarcascade_frontalface_default.xml 正面人脸检测
haarcascade_fullbody.xml 身形检测
haarcascade_lefteye_2splits.xml 左眼检测
haarcascade_lowerbody.xml 下半身检测
haarcascade_profileface.xml 侧面人脸检测
haarcascade_righteye_2splits.xml 右眼检测
haarcascade_russian_plate_number.xml 车牌检测
haarcascade_smile.xml 笑容检测
haarcascade_upperbody.xml 上半身检测
检测出的人脸位置
人脸检测的结果是可以在图像中标出检测到的人脸位置,从而为后续的人脸识别提供基础。
15.2 检测其他内容
除了人脸检测,系统还可以检测其他对象,包括:
眼睛检测
猫脸检测
行人检测
车牌检测
检测出的眼睛位置、猫脸位置、行人位置和车牌位置
检测系统能够准确地在图像中标出这些对象的位置,以支持各种应用场景。
15.3 人脸识别
人脸识别是通过分析人脸特征来识别身份的过程。主要算法包括:
Eigenfaces 人脸识别器
Fisherfaces 人脸识别器
Local Binary Pattern Histogram 人脸识别器
识别过程示例
人脸识别的过程通常需要多个步骤,包括对比待识别照片与已有的照片库,通过特征匹配来判断身份。
15.4 小结
“人脸检测和人脸识别是相辅相成的。”
在进行人脸识别前,必须先通过人脸检测确定图像中是否存在人脸。只有在检测到人脸后,才能进一步进行身份识别。因此,人脸识别的过程包括首先检测人脸,然后识别该人脸属于哪个人。
📊 第16章 MR智能视频打卡系统
传统打卡方式与人脸打卡
“传统的打卡方式包括点名、签字、刷卡和指纹等。随着技术的不断发展,计算机视觉技术越来越强大,已经可以实现人脸打卡功能。”
传统打卡方式:
点名
签字
刷卡
指纹
人脸打卡:
通过摄像头扫描人脸特征
利用人脸的差异识别人员
准确性不输于指纹打卡,且安全性和便捷性更高
需求分析
需求拆解
在开发MR智能视频打卡系统前,需求分析包括以下几个方面:
数据模型
打卡功能
数据维护
考勤报表
系统设计
开发环境
Python版本:3.8.2
OpenCV版本:4.2.0
numpy版本:1.18.1
IDE:PyCharm 2019.3.3 (社区版)
操作系统:Windows 7/Windows 10
功能结构
打卡功能
查看记录功能
员工管理功能
考勤报表功能
权限管理功能
文件系统设计
数据文件及文件夹信息
所在路径 文件名 说明
/data/ employee_data.txt 保存所有员工信息的文件
/data/ lock_record.txt 保存所有员工打卡记录的文件
/data/ work_time.txt 保存上下班时间
/data/ user_password.txt 保存管理员的账号和密码
/data/face/ .png 员工的照片(PNG格式图片文件)
数据实体模块设计
员工类设计
employees.py文件:
封装数据模型
提供维护数据的方法
包含以下内容:
构建员工类
全局变量
增删员工
分配ID
工具模块设计
公共工具模块
IO流模块
摄像头工具模块
服务模块设计
服务模块功能
人事服务模块
人脸识别服务模块
打卡规则
打卡时间范围 打卡记录状态 分析结果
KaTeX can only parse string typed expression
0:00:00<打卡时间<23:59:59 正常 不缺席
KaTeX can only parse string typed expression
not(0:00:00<打卡时间<23:59:59) 不正常 缺席
KaTeX can only parse string typed expression
打卡时间≤上班时间 正常 正常上班打卡
KaTeX can only parse string typed expression
上班时间<打卡时间≤12:00:00 不正常 迟到
KaTeX can only parse string typed expression
12:00:00<打卡时间<下班时间 不正常 早退
程序入口设计
主菜单功能
用户权限管理
人脸打卡功能
新员工登记人脸照片样本
删除员工全部数据
查询员工打卡记录
生成考勤报表
自定义上下班时间
启动程序
打卡成功示例
员工打卡
员工王五打卡成功
查看记录功能
查看员工列表与打卡记录
员工管理功能菜单
查看打卡记录
打印考勤日报
生成考勤月报
CSV文件操作
用记事本和Office Excel打开CSV格式的月报
小结
本章详细介绍了MR智能视频打卡系统的开发流程,主要包括五大功能:打卡、退出、查看记录、员工管理和考勤报表。其中,查看记录、员工管理和考勤报表三个功能需要管理员权限才能使用。该项目采用命令提示符窗口实现与计算机之间的交互,虽有简陋但不影响实用价值。