OpenCV轻松入门 面向Python 学习笔记(1)
参考:
OpenCV轻松入门 面向Python [李立宗]
OpenCV 入门教程 [于仕琪]
前言 构造复杂的计算机视觉应用变得越来越容易了。
OpenCV、YOLO和SSD这三者的关系可以概括为:
OpenCV是一个强大的“工具箱”,而YOLO和SSD是两种先进的“工具”,这个工具箱不仅支持使用这些工具,还能帮助完成使用工具前后的所有准备工作。
下面我们来详细解释它们各自是什么,以及它们之间如何协作。
1. OpenCV(开源计算机视觉库)
- 定位:一个功能极其丰富的计算机视觉库。
- 核心功能:它提供了大量用于图像和视频处理的基础函数,如图像读取、显示、裁剪、缩放、颜色空间转换、滤波、边缘检测、特征提取等。它本身也包含一些传统的(非深度学习的)目标检测算法,如Haar级联检测器。
- 角色:基础设施/多面手。你可以把它想象成一个“瑞士军刀”,什么都能干一点,尤其是在图像预处理和后处理方面非常强大。
2. YOLO(You Only Look Once)和 SSD(Single Shot MultiBox Detector)
- 定位:两种基于深度学习的目标检测算法/模型。
- 核心功能:它们都属于“单阶段”检测器,特点是速度快,能够在图像中实时地识别出多个物体并标出它们的位置(边界框)和类别(如人、车、狗)。
- YOLO:以其极快的速度和统一的检测框架闻名。它将整个图像一次性输入神经网络,直接预测边界框和类别概率。
- SSD:同样速度快,它的创新之处在于在不同尺度的特征图上进行检测,对于不同大小的物体都有较好的检测效果。
- 角色:专门的“专家” 。它们只专注于一件事——以高精度和高速度在图片里找东西。
三者之间的关系
关系一:OpenCV 可以调用 YOLO 和 SSD 模型进行目标检测
这是最常见的关系。OpenCV 从 3.3 版本开始,引入了一个非常强大的模块 dnn(深度神经网络) 。这个模块允许你直接加载训练好的深度学习模型(包括YOLO和SSD),并用它们进行推理。
典型的工作流程如下:
- 使用 OpenCV 读取图像或视频流:
cv2.imread()或cv2.VideoCapture()。 - 使用 OpenCV 对图像进行预处理:将图像缩放为模型需要的尺寸、归一化像素值、转换颜色通道等。这些都是OpenCV的强项。
- 使用 OpenCV.dnn 模块加载 YOLO 或 SSD 模型:读取模型文件(通常是
.weights和.cfg文件 for YOLO,或.caffemodel和.prototxt文件 for SSD)。 - 将预处理后的图像输入模型进行前向传播(推理) :得到模型的原始输出(通常是边界框坐标、置信度和类别概率)。
- 使用 OpenCV 对模型输出进行后处理:
- 非极大值抑制(NMS) :过滤掉重叠的、置信度低的冗余检测框。
- 将边界框坐标还原到原始图像的尺寸上。
- 使用 OpenCV 将检测结果可视化:在图像上绘制矩形框、添加标签文字等。
cv2.rectangle(),cv2.putText()。
总结这个关系:OpenCV 为 YOLO/SSD 模型提供了从数据输入、预处理到结果输出、可视化的“一站式”解决方案。
关系二:YOLO 和 SSD 是 竞争/替代 关系
在目标检测领域,YOLO 和 SSD 是同一类别(单阶段实时检测器)中的两个代表性算法。它们之间存在竞争关系,各有优劣:
- YOLO(尤其是v3及之后的版本)在速度和精度之间取得了很好的平衡,版本迭代非常快(v4, v5, v7, v8等)。
- SSD 在小物体检测上通常有不错的表现,并且有很多优秀的变体(如DSSD, FSSD等)。
开发者会根据具体需求(如速度优先还是精度优先)来选择使用YOLO还是SSD。
关系三:OpenCV 也包含 其他 目标检测方法
除了调用YOLO/SSD这些深度学习模型,OpenCV本身也自带了一些更轻量级、更传统的目标检测算法,例如:
- Haar级联分类器:常用于人脸检测。
- HOG + SVM:常用于行人检测。
这些方法不需要强大的GPU,在资源受限的环境下或对精度要求不高的场景中仍然有用武之地。
一个简单的类比
- OpenCV 就像是一个 现代化的厨房。它有灶台、水池、菜刀、锅碗瓢盆(图像处理函数),甚至还有一个通用的万能智能厨具接口(
dnn模块)。 - YOLO 和 SSD 就像是两种不同品牌、不同风格的 全自动炒菜机(深度学习模型)。它们专门负责“炒菜”(目标检测)这个核心任务,而且做得非常专业、快速。
- 工作流程:你从冰箱里拿出食材(用OpenCV读取图像),在水池里洗菜切菜(用OpenCV预处理),然后把食材放进YOLO或SSD这台炒菜机里(通过OpenCV的
dnn模块调用),炒菜机完成烹饪(模型推理),最后你把做好的菜装盘、摆盘(用OpenCV进行后处理和可视化)。
结论
OpenCV是一个基础的、多功能的计算机视觉库,它通过其dnn模块支持并整合了像YOLO和SSD这样的先进深度学习模型,从而极大地简化了高性能目标检测应用的开发流程。
因此,在实际项目中,你经常会看到它们三者协同工作。
OpenCV库包含从计算机视觉各个领域衍生出来的500多个函数,包括工业产品质量检验、医学图像处理、安保领域、交互操作、相机校正、双目视觉以及机器人学。
因为计算机视觉和机器学习经常在一起使用,所以OpenCV也包含一个完备的、具有通用性的机器学习库(ML模块)。
这个子库聚焦于统计模式识别以及聚类。
ML模块对OpenCV的核心任务(计算机视觉)相当有用,但是这个库也足够通用,可以用于任意机器学习问题。
内 容 简 介
本书以 OpenCV官方文档的知识脉络为主线,并对细节进行补充和说明。
书中不仅介绍了 OpenCV 函数的使用方法,还介绍了函数实现的算法原理。
在介绍 OpenCV 函数的使用方法时,提供了大量的程序示例。而且在介绍函数对图像的处理前,往往
先展示函数对数值、数组的处理,方便读者从数值的角度观察和理解函数的处理过程和结果。
需要说明的一点是,本书为黑白印刷,无法很好地呈现某些程序的运行效果,请读者自行运行程序并观察结果。
我们可以从“黑盒”和“白盒”两个角度学习 OpenCV: 尽量在学习之间取得平衡。
将 OpenCV 作为“白盒”学习:深入学习 OpenCV 每个函数所使用算法的基本原理、每个函数的具体实现细节,进一步加深对图像处理的理解。
将 OpenCV 作为“黑盒”学习:仅仅将 OpenCV 作为一个工具来使用,学习的是每个函数内参数的含义和使用方式,学习的目的是更好地使用 OpenCV 函数。
在介绍具体的算法原理时,尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用过多复杂抽象的公式。...
OpenCV 本身是一个“黑盒”,它为我们提供了接口(参数、返回值)。我们只需要掌握接口的正确使用方法,就可以在完全不了解其内部工作原理(算法)的情况下,方便地进行各种复杂的图像处理。
就像Photoshop我们是使用它的功能,而不需要系统地学习每个功能所采用的算法原理。
但是很明显,我们在使用 OpenCV 进行图像处理时,是不能完全忽略算法实现的,否则是不可能用好 OpenCV 的,更不能设计出好的计算机视觉应用系统。
感谢 OpenCV 开源库的所有贡献者。李立宗2019 年 3 月... 博文视点社区本书页面。http://www.broadview.com.cn/36290
OpenCV 是一个广受欢迎的开源计算机视觉库,它提供了很多函数,实现了很多计算机视觉算法,算法从最基本的滤波到高级的物体检测皆有涵盖。
很多初学者希望快速掌握 OpenCV 的使用方法,但往往会遇到各种各样的困难。其实仔细分析,造成这些困难的原因有两类:
- 第一类是 C/C++编程基础不过关;
- 第二类是不了解算法原理。
解决这些困难无非
- 提升编程能力,以及
- 提升理论基础知识。
- 提升编程能力需要多练习编程,
- 提升理论知识需要系统学习《数字图像处理》、《计算机视觉》和《模式识别》等课程,所有这些都不能一蹴而就,需要耐下心来认真修炼。
同时我们也需要认识到 OpenCV 只是一个算法库,能为我们搭建计算机视觉应用提供“砖头”。我们并不需要完全精通了算法原理之后才去使用 OpenCV,只要了解了“砖头”的功能,就可以动手了。
在实践中学习才是最高效的学习方式。本小册子希望为初学者提供引导,使初学者快速了解 OpenCV 的基本数据结构以及用法。
此外,如您发现有错误之处,欢迎来信指正。
OpenCV 入门
OpenCV 是一个开源的计算机视觉库,1999 年由英特尔的 Gary Bradski 启动。Bradski 在访学过程中注意到,在很多优秀大学的实验室中,都有非常完备的内部公开的计算机视觉接口。
这些接口从一届学生传到另一届学生,对于刚入门的新人来说,使用这些接口比重复造轮子方便多了。这些接口可以让他们在之前的基础上更有效地开展工作。
OpenCV 正是基于为计算机视觉提供通用接口这一目标而被策划的。
由于要使用计算机视觉库,用户对处理器(CPU)的要求提升了,他们希望购买更快的处理器,这无疑会增加英特尔的产品销量和收入。这也许就解释了为什么 OpenCV 是由硬件厂商而非软件厂商开发的。
当然,随着 OpenCV 项目的开源,目前其已经得到了基金会的支持,很大一部分研究主力也转移到了英特尔之外,越来越多的用户为 OpenCV 做出了贡献。
OpenCV 库由 C 和 C++语言编写,涵盖计算机视觉各个领域内的 500 多个函数,可以在多种操作系统上运行。它旨在提供一个简洁而又高效的接口,从而帮助开发人员快速地构建视觉应用。
OpenCV 介绍
OpenCV 的全称是 Open Source Computer Vision Library,是一个开放源代码的计算机视觉库。
OpenCV 是最初由英特尔公司发起并开发,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用,现在美国 Willow Garage 为 OpenCV 提供主要的支持。OpenCV 可用于开发实时的图像处理、计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用。
2.1 OpenCV 的 来源
OpenCV 诞生于 Intel。Intel 最初希望提供一个计算机视觉库,使之能充分发掘 CPU 的计算能力,当然更希望以此促进 Intel 的产品的销售。OpenCV 最初的开发工作是由 Intel 在俄罗斯的团队实现。这里面有两个关键人物,一个是 Intel 性能团队(Intel’s Performance Library Team)的李信弘(Shinn Lee)先生,他是团队的经理,负责 IPP 等库,给予 OpenCV 很大的支持。另一个关键人物是 VadimPisarevsky,Vadim 在 Intel 负责 OpenCV 的项目管理、代码集成、代码优化等工作。在后期 Intel 支持渐少的时候,是 Vadim Pisarevsky 一直在维护着 OpenCV。
2007 年 6 月,受本书作者之邀,李信弘和 Vadim Pisarevsky 作为嘉宾参加了在北京举行的“开放源代码计算机视觉库(OpenCV)研讨会”并做了非常有价值的报告。
在 2008 年,一家美国公司,Willow Garage 2 ,开始大力支持 OpenCV,Vadim Pisarevsky 和 Gary Bradski 都加入了 Willow Garage。Gary Bradski 也是 OpenCV 开发者中的元老级人物,他曾出版《Leaning OpenCV》一书,广受欢迎。
Willow Garage 是一家机器人公司,致力于为个人机器人开发开放的硬件平台和软件。现在已经开发了 PR2 机器人,并支持 ROS、OpenCV、PCL 等软件。
ROS(Robot Operating System)是用于机器人的操作系统,是一个开放源代码的软件,OpenCV 作为 ROS 的视觉模块嵌入。
自从获得 Willow Garage 支持后,OpenCV 的更新速度明显加快。大量的新特性被被加入 OpenCV 中,很多算法都是最近一两年的新的科研成果。OpenCV 正日益成为算法研究和产品开发不可缺少的工具。
2.2 OpenCV 的协议
OpenCV 采用 BSD 协议,这是一个非常宽松的协议。简而言之,用户可以修改 OpenCV 的源代码,可以将 OpenCV 嵌入到自己的软件中,可以将包含 OpenCV的软件销售,可以用于商业产品,也可以用于科研领域。
BSD 协议并不具有“传染性”,如果你的软件中使用了 OpenCV,你不需要公开代码。你可以对 OpenCV做任何操作,协议对用户的唯一约束是要在软件的文档或者说明中注明使用了OpenCV,并附上 OpenCV 的协议。
在这个宽松协议下,企业可以在 OpenCV 基础之上进行产品开发,而不需要担心版权问题(当然你要注明使用了 OpenCV,并附上 OpenCV 的协议)。科研领域的研究者,可以使用 OpenCV 快速地实现系统原型。因此可以这样说,OpenCV的协议保证了计算机视觉技术快速的传播,让更多的人从 OpenCV 受益。
1 研讨会网址:http://www.opencv.org.cn/index.php/OpenCV_Symposium
2 Willow Garage 公司网站:http://www.willowgarage.com
目录
//第 1 章 OpenCV 入门
1.1 如何使用 1.2 图像处理基本操作=读取图像/显示图像 /保存图像 1.3 OpenCV 贡献库
//第 2 章 图像处理基础
2.1 图像的基本表示方法 2.2 像素处理 2.3 使用 numpy.array 访问像素 2.4 感兴趣区域(ROI) 2.5 通道操作=通道拆分 /通道合并 2.6 获取图像属性
//第 3 章 图像运算
3.1 图像加法运算=加号运算符/ cv2.add()函数 3.2 图像加权和 3.3 按位逻辑运算=按位与运算/按位或运算/按位非运算/按位异或运算 3.4 掩模 3.5 图像与数值的运算 3.6 位平面分解 3.7 图像加密和解密 3.8 数字水印=原理/实现方法 /例题 3.9 脸部打码及解码
//第 4 章 色彩空间类型转换
4.1 色彩空间基础=GRAY 色彩空间 /XYZ 色彩空间/YCrCb 色彩空间 /HSV 色彩空间/HLS 色彩空间/ CIEL*a*b*色彩空间 / CIEL*u*v*色彩空间/Bayer 色彩空间 4.2 类型转换函数 4.3 类型转换实例= 通过数组观察转换效果/图像处理实例 4.4 HSV 色彩空间讨论= 基础知识 / 获取指定颜色/标记指定颜色/ 标记肤色/实现艺术效果 4.5 alpha 通道
//第 5 章 几何变换
5.1 缩放 5.2 翻转 5.3 仿射平移/旋转 /更复杂的仿射变换 5.4 透视 5.5 重映射 =映射参数的理解/复制/ 绕 x 轴翻转 /绕 y 轴翻转 /绕 x 轴、y 轴翻转 / x 轴、y 轴互换 / 图像缩放
//第 6 章 阈值处理
6.1 threshold 函数= 二值化阈值处理(cv2.THRESH_BINARY)/反二值化阈值处理(cv2.THRESH_BINARY_INV)/截断阈值化处理(cv2.THRESH_TRUNC)/ 超阈值零处理(cv2.THRESH_TOZERO_INV)/ 低阈值零处理(cv2.THRESH_TOZERO) 6.2 自适应阈值处理 6.3 Otsu 处理
//第 7 章 图像平滑处理
7.1 均值滤波=基本原理 / 函数语法 /程序示例 7.2 方框滤波=基本原理 / 函数语法 /程序示例 7.3 高斯滤波=基本原理 / 函数语法 /程序示例 7.4 中值滤波=基本原理 / 函数语法 /程序示例 7.5 双边滤波=基本原理 / 函数语法 /程序示例 7.6 2D 卷积
//第 8 章 形态学操作
8.1 腐蚀 8.2 膨胀 8.3 通用形态学函数 8.4 开运算 8.5 闭运算 8.6 形态学梯度运算 8.7 礼帽运算 8.8 黑帽运算 8.9 核函数
//第 9 章 图像梯度
9.1 Sobel 理论基础 9.2 Sobel 算子及函数使用 =参数 ddepth/方向 /实例 9.3 Scharr 算子及函数使用 9.4 Sobel 算子和 Scharr 算子的比较 9.5 Laplacian 算子及函数使用 9.6 算子总结
//第 10 章 Canny 边缘检测
10.1 Canny 边缘检测基础 10.2 Canny 函数及使用
//第 11 章 图像金字塔
11.1 理论基础 11.2 pyrDown 函数及使用 11.3 pyrUp 函数及使用 11.4 采样可逆性的研究 11.5 拉普拉斯金字塔= 定义/应用
//第 12 章 图像轮廓
12.1 查找并绘制轮廓=查找图像轮廓:findContours 函数/绘制图像轮廓:drawContours 函数/轮廓实例 12.2 矩特征 =矩的计算:moments 函数 /计算轮廓的面积:contourArea 函数/计算轮廓的长度:arcLength 函数 12.3 Hu 矩= Hu 矩函数 / 形状匹配 12.4 轮廓拟合= 矩形包围框/最小包围矩形框 / 最小包围圆形/最优拟合椭圆/ 最优拟合直线/ 最小外包三角形 /逼近多边形 12.5 凸包=获取凸包/凸缺陷/几何学测试 12.6 利用形状场景算法比较轮廓 =计算形状场景距离/计算 Hausdorff 距离 12.7 轮廓的特征值 =宽高比/Extent /Solidity /等效直径(Equivalent Diameter)/方向/ 掩模和像素点/最大值和最小值及它们的位置/平均颜色及平均灰度 /极点
//第 13 章 直方图处理
13.1 直方图的含义 13.2 绘制直方图= 使用 Numpy 绘制直方图/使用 OpenCV 绘制直方图/使用掩模绘制直方图 13.3 直方图均衡化 = 直方图均衡化原理 / 直方图均衡化处理 13.4 pyplot 模块介绍=subplot 函数 /imshow 函数
//第 14 章 傅里叶变换
14.1 理论基础 14.2 Numpy 实现傅里叶变换= 实现傅里叶变换 /实现逆傅里叶变换 /高通滤波示例 14.3 OpenCV 实现傅里叶变换 =实现傅里叶变换/实现逆傅里叶变换 /低通滤波示例
//第 15 章 模板匹配
15.1 模板匹配基础 15.2 多模板匹配
第 16 章 霍夫变换
16.1 霍夫直线变换 / 霍夫变换原理/HoughLines 函数 /HoughLinesP 函数 16.2 霍夫圆环变换
第 17 章 图像分割与提取
17.1 用分水岭算法实现图像分割与提取=算法原理/ 相关函数介绍/分水岭算法图像分割实例 17.2 交互式前景提取
第 18 章 视频处理
18.1 VideoCapture 类=类函数介绍 /捕获摄像头视频 / 播放视频文件 18.2 VideoWriter 类 =类函数介绍/保存视频 18.3 视频操作基础
//第 19 章 绘图及交互
19.1 绘画基础 =绘制直线/ 绘制矩形/绘制圆形/绘制椭圆/绘制多边形 / 在图形上绘制文字 19.2 鼠标交互 =简单示例/进阶示例 19.3 滚动条 = 用滚动条实现调色板 /用滚动条控制阈值处理参数/用滚动条作为开关
//第 20 章 K 近邻算法
20.1 理论基础 20.2 计算 = 归一化 / 距离计算 20.2 手写数字识别的原理 20.3 自定义函数手写数字识别 20.4 K 近邻模块的基本使用 20.5 K 近邻手写数字识别
//第 21 章 支持向量机
21.1 理论基础 21.2 SVM 案例介绍
//第 22 章 K 均值聚类
22.1 理论基础 =分豆子 /K 均值聚类的基本步骤 22.2 K 均值聚类模块 22.3 简单示例
//第 23 章 人脸识别
23.1 人脸检测 =基本原理/级联分类器的使用 / 函数介绍/ 案例介绍 23.2 LBPH 人脸识别= 基本原理/ 函数介绍 /案例介绍 23.3 EigenFaces 人脸识别=基本原理/函数介绍/案例介绍 23.4 Fisherfaces 人脸识别 =基本原理/函数介绍/案例介绍 23.5 人脸数据库
参与文献
附录 A 范例
目录
//第 1 章 预备知识 1.1 编程的流程 1.2 什么叫编辑 1.3 什么叫编译 1.4 什么叫连接 1.5 什么叫运行 1.6 Visual C++是什么 1.7 头文件 1.8 库文件 1.9 OpenCV 是什么 1.10 什么是命令行参数 1.11 常见编译错误=找不到头文件/ 拼写错误 1.12 常见链接错误 1.13 运行时错误 //第 2 章 OpenCV 介绍 2.1 OpenCV 的来源 2.2 OpenCV 的协议 //第 3 章 图像的基本操作 3.1 图像的表示 3.2 Mat 类 3.3 创建 Mat 对象=构造函数方法 / create()函数创建对象 /Matlab 风格的创建对象方法 3.4 矩阵的基本元素表达 3.5 像素值的读写 =at()函数/ 使用迭代器/ 通过数据指针 3.6 选取图像局部区域=单行或单列选择/用 Range 选择多行或多列 / 感兴趣区域 /取对角线元素 3.7 Mat 表达式 3.8 Mat_类 3.9 Mat 类的内存管理 3.10 输出 3.11 Mat 与 IplImage 和 CvMat 的转换 =Mat 转为 IplImage 和 CvMat 格式/IplImage 和 CvMat 格式转为 Mat //第 4 章 数据获取与存储 4.1 读写图像文件=读图像文件 /写图像文件 4.2 读写视频 = 读视频/写视频
https://gitee.com/powes/,作者:前沿风暴,转载请注明原文链接:https://www.cnblogs.com/Kreos/p/19402642

浙公网安备 33010602011771号