本书重点
借助Qt C++的跨平台特性,解析OpenCV图像与视频处理技术,实战数字水印、图像加解密、物体计数、图像轮廓、手势识别、停车场车牌识别案例。
内容简介
本书共分20章,主要内容包括计算机视觉概述、OpenCV的Python开发环境搭建、OpenCV基本操作、数组矩阵、图像处理模块、灰度变换和直方图修正、图像平滑、几何变换、图像边缘检测、图像分割、图像金字塔、图像形态学、视频处理,以及停车场车牌识别、目标检测、数字水印、图像加解密、物体计数、图像轮廓、手势识别等案例。
适合读者
本书既适合OpenCV初学者、计算机视觉与图像处理应用开发人员、人工智能算法开发人员阅读,也适合高等院校或高职高专院校计算机视觉与图像处理、人工智能等相关专业的师生教学参考。
作者简介
朱文伟,名校计算机专业统招硕士,20多年C\C++、Java开发经验。主导开发过密码、图形、人工智能等产品。精通Linux、Windows系统开发及数据库开发技术。著有图书《OpenCV计算机视觉开发实践:基于Qt C++》《OpenCV计算机视觉开发实践:基于Python》《Linux C与C++一线开发实践(第2版)》《Rust编程与项目实战》《嵌入式Linux驱动开发实践》《高性能Linux网络编程核心技术揭秘》《Linux C/C++服务器开发实践》《Qt 6.x从入门到精通》《PyQt 5从入门到精通》《Linux C与C++ 一线开发实践》《Visual C++2017从入门到精通》《Windows C/C++加密解密实战》《密码学原理与Java实现》《OpenCV 4.5计算机视觉开发实战(基于VC++)》《OpenCV 4.5计算机视觉开发实战:基于Python》。
前言
如今,计算机视觉算法的应用已经渗透到我们生活的方方面面。机器人、无人机、增强现实、虚拟现实、医学影像分析等,无一不涉及计算机视觉算法。OpenCV是计算机视觉领域的一个图形与图像算法库,在学术界和工业界都得到了广泛的使用。无论是初学者、开发人员还是研究人员,都可以在其中找到得心应手的“武器”,帮助你在开发与研究的道路上披荆斩棘。
关于本书
近年来,在入侵检测、特定目标跟踪、人脸识别等领域,OpenCV可谓大显身手。OpenCV内容之丰富,是目前开源视觉算法库中罕见的。市场上有很多关于OpenCV的图书,但是随着OpenCV版本的迭代,部分学习资料已经过时。本书基于OpenCV 4.10版本和Qt C++进行编写,面向初学者和专业人士,涵盖传统的图形、图像算法,以及相关实战案例,并配以示例代码,内容丰富,行文通俗。
?本书不仅剖析了大量OpenCV函数的调用细节,而且对原理解释得清晰明了,让读者不仅知其然,而且知其所以然。
?本书介绍了OpenCV 4.10中220多个函数、100多个示例程序,帮助读者熟练掌握基于Qt C++的OpenCV编程方法。
?本书在介绍OpenCV 4.10技术的同时,也力求讲解一些背后的原理和公式,为读者以后成为专业的图像开发者铺垫前进的道路。记住,只会调用函数而不知原理和公式,永远不会成为一个专业人士!
资源下载与技术支持
本书提供配套示例源码、PPT课件、作者QQ答疑服务,读者需要用微信扫描下面二维码下载,也可按扫描出来的页面提示把下载链接转发到自己的邮箱中下载。如果阅读中发现问题或存在疑问,请联系下载资源中提供的相关电子邮箱或微信号。
本书适合的读者
阅读本书需要有Qt C++编程基础,适合的读者如下:
?OpenCV开发初学者
?计算机视觉领域的初学者
?人工智能图像处理算法开发人员
?高等院校计算机视觉课程的学生
?高职高专院校计算机视觉课程的学生
作者与鸣谢
本书作者是朱文伟和李建英。虽然作者已尽最大努力编写本书,但书中难免存在疏漏之处,敬请读者提出宝贵意见和建议。
本书的顺利出版,离不开清华大学出版社的老师们的支持和帮助,在此表示衷心感谢。
作 者
2025年1月
目录
目 录
第1章 数字图像视觉概述 1
1.1 图像的基本概念 1
1.1.1 图像和图形 1
1.1.2 什么是数字图像 1
1.1.3 数字图像的特点 2
1.1.4 图像单位(像素) 2
1.1.5 图像分辨率 3
1.1.6 屏幕分辨率 3
1.1.7 图像的灰度 4
1.1.8 灰度级 4
1.1.9 图像深度 4
1.1.10 二值图像 5
1.1.11 灰度图 5
1.1.12 彩色图像 5
1.1.13 通道 6
1.1.14 图像存储 6
1.2 图像噪声 6
1.2.1 图像噪声的定义 6
1.2.2 图像噪声的来源 7
1.2.3 图像噪声的滤除 7
1.3 图像处理 8
1.3.1 图像处理的分类 8
1.3.2 数字图像处理 9
1.3.3 数字图像处理常用的方法 9
1.3.4 图像处理的应用 12
1.4 图像信号处理层次 12
1.5 计算机视觉 13
1.5.1 计算机视觉的概念 13
1.5.2 计算机视觉系统的构成和分类 14
1.5.3 机器视觉的优势 14
1.5.4 机器视觉系统的应用 14
1.5.5 计算机视觉与相关学科的关系 15
1.6 OpenCV概述 15
1.7 Qt简介 17
第2章 搭建OpenCV开发环境 19
2.1 Windows下搭建OpenCV开发环境 19
2.1.1 下载和安装Qt 19
2.1.2 下载和解压OpenCV 26
2.1.3 了解构建工具 27
2.1.4 下载和安装CMake 28
2.1.5 生成Makefile文件 30
2.1.6 开始编译OpenCV 33
2.1.7 Qt开发的第一个OpenCV程序 34
2.2 Linux下搭建OpenCV开发环境 38
2.2.1 准备编译OpenCV所需依赖 39
2.2.2 编译OpenCV源码 40
2.2.3 Linux下的第一个OpenCV程序 43
2.2.4 下载Qt 46
2.2.5 安装依赖包 46
2.2.6 安装Qt 47
2.2.7 Linux下用Qt开发OpenCV 51
2.2.8 做个快照 54
2.3 数学函数 55
2.4 OpenCV架构 56
2.5 图像输入输出模块imgcodecs 57
2.5.1 imread读取图像文件 58
2.5.2 imwrite保存图片 60
2.6 OpenCV界面编程 62
2.6.1 新建窗口并显示 62
2.6.2 单窗口显示多幅图像 64
2.6.3 销毁窗口 66
2.6.4 调整窗口大小 68
2.6.5 鼠标事件 69
2.6.6 键盘事件 71
2.6.7 滑动条事件 73
第3章 核心模块Core 76
3.1 矩阵操作 76
3.1.1 矩阵类Mat 76
3.1.2 构造法 78
3.1.3 直接赋值法 82
3.1.4 数组法 82
3.1.5 create函数法 83
3.1.6 定义特殊矩阵 83
3.1.7 得到矩阵的行数、列数和维数 84
3.1.8 矩阵的数据指针及其打印 85
3.1.9 创建新的矩阵头 86
3.1.10 得到矩阵通道数 88
3.1.11 复制矩阵 88
3.1.12 判断矩阵是否有元素 93
3.1.13 矩阵的5种遍历方式 93
3.1.14 设置矩阵新值 100
3.1.15 得到矩阵的元素总个数 100
3.1.16 矩形类Rect 100
3.2 数组的操作 101
3.3 读写XML和YAML文件 105
3.3.1 YAML文件简介 105
3.3.2 写入和读取YAML\XML文件的基本步骤 106
3.3.3 XML、YAML文件的打开 106
3.3.4 文本和数字的输入和输出 106
3.3.5 OpenCV数据结构的输入和输出 106
3.3.6 vector(arrays)和maps的输入和输出 107
3.3.7 文件关闭 107
第4章 图像处理模块基础 113
4.1 颜色变换cvtColor 113
4.2 画基本图形 115
4.2.1 点的表示 115
4.2.2 画矩形 116
4.2.3 画圆 117
4.2.4 画椭圆 119
4.2.5 画线段 122
4.2.6 填充多边形 122
4.3 像素存放类Scalar 124
4.4 使用随机数 126
4.4.1 产生一个随机数 128
4.4.2 返回下一个随机数 130
4.4.3 用随机数填充矩阵 131
4.5 文字绘制 132
4.6 为图像添加边框 139
4.7 在图像中查找轮廓 142
第5章 灰度变换和直方图修正 149
5.1 点运算 149
5.1.1 基本概念 149
5.1.2 点运算的目标 150
5.1.3 点运算的分类 150
5.1.4 点运算的特点 150
5.1.5 点运算的应用 150
5.2 灰度变换 151
5.2.1 灰度变换概述 151
5.2.2 灰度变换的作用 152
5.2.3 灰度变换的方法 152
5.2.4 灰度化 152
5.2.5 对比度 155
5.2.6 灰度的线性变换 155
5.2.7 分段线性灰度变换 160
5.2.8 对数变换和反对数变换 165
5.2.9 幂律变换 170
5.3 直方图修正 172
5.3.1 直方图的概念 172
5.3.2 OpenCV实现灰度直方图 173
5.3.3 直方图均衡化 175
第6章 图像平滑 181
6.1 平滑处理算法 181
6.2 线性滤波 183
6.2.1 归一化方框滤波器 183
6.2.2 高斯滤波器 185
6.3 非线性滤波 188
6.3.1 中值滤波 188
6.3.2 双边滤波 189
第7章 几何变换 193
7.1 几何变换基础 193
7.2 图像平移 196
7.3 图像旋转 198
7.4 仿射变换 204
7.5 图像缩放 207
7.5.1 缩放原理 207
7.5.2 OpenCV中的缩放 209
第8章 图像边缘检测 211
8.1 图像边缘检测概述 211
8.2 边缘检测研究的历史现状 213
8.3 边缘定义及类型分析 214
8.4 梯度的概念 216
8.5 图像边缘检测的应用 216
8.6 目前边缘检测存在的问题 217
8.7 边缘检测的基本思想 218
8.8 图像边缘检测的步骤 219
8.9 经典图像边缘检测算法 220
8.9.1 差分边缘检测 221
8.9.2 Roberts算子 223
8.9.3 Sobel算子边缘检测 225
8.9.4 Prewitt算子边缘检测 227
8.9.5 LoG边缘检测算子 230
8.9.6 边缘检测的新技术与方法 235
第9章 图像分割 238
9.1 图像分割概述 238
9.2 图像分割的应用 240
9.3 图像分割的数学定义 240
9.4 图像分割方法的分类 241
9.4.1 基于阈值化的分割方法 242
9.4.2 基于边缘的分割方法 243
9.4.3 基于区域的分割方法 243
9.4.4 基于神经网络的分割方法 245
9.4.5 基于聚类的分割方法 246
9.5 使用OpenCV进行图像分割 246
9.5.1 阈值分割 246
9.5.2 固定阈值分割 247
9.5.3 自适应阈值分割 250
9.6 彩色图像分割 256
9.7 grabCut算法分割图像 259
9.7.1 基本概念 259
9.7.2 grabCut函数 260
9.8 floodFill(漫水填充)分割 263
9.8.1 基本概念 263
9.8.2 floodFill函数 264
9.9 分水岭分割法 270
9.9.1 基本概念 270
9.9.2 wathershed函数 271
第10章 图像金字塔 279
10.1 图像金字塔概述 279
10.2 高斯金字塔 280
10.2.1 向下采样 281
10.2.2 向上采样 284
10.3 拉普拉斯金字塔 286
第11章 图像形态学 288
11.1 图像形态学概述 288
11.2 形态学的应用 288
11.2.1 数学上的形态学 289
11.2.2 格 289
11.2.3 拓扑学 289
11.2.4 数学形态学的组成 290
11.2.5 数学形态学的应用 290
11.2.6 操作分类 291
11.3 结构元素 291
11.4 膨胀 291
11.5 腐蚀 292
11.6 开运算 294
11.7 闭运算 295
11.8 实现腐蚀和膨胀 296
11.9 开闭运算和顶帽黑帽 299
11.10 击中击不中 302
11.11 利用形态学运算提取水平线和垂直线 305
第12章 视频处理 311
12.1 OpenCV视频处理架构 311
12.2 类VideoCapture 312
12.3 构造VideoCapture对象 312
12.4 判断视频是否打开成功 313
12.5 读取视频帧 314
12.6 播放视频文件 314
12.7 获取和设置视频属性 316
12.8 播放摄像头视频 319
12.9 录制视频类VideoWriter 321
12.9.1 构造VideoWriter对象 321
12.9.2 初始化或重新初始化 322
12.9.3 连接一个fourcc代码 322
12.10 实现一个视频播放器 324
第13章 机器学习 330
13.1 机器学习概述 330
13.2 机器学习发展历程 331
13.3 机器学习研究现状 332
13.3.1 传统机器学习的研究现状 333
13.3.2 大数据环境下机器学习的研究现状 334
13.4 机器学习的分类 334
13.4.1 基于学习策略的分类 335
13.4.2 基于学习方法的分类 335
13.4.3 基于学习方式的分类 336
13.4.4 基于数据形式的分类 336
13.4.5 基于学习目标的分类 336
13.5 机器学习常见算法 336
13.6 机器学习的研究内容 338
13.7 机器学习的应用 339
13.8 OpenCV中的机器学习 340
13.8.1 支持向量机 341
13.8.2 贝叶斯分类器 345
第14章 数字水印 348
14.1 数字水印概述 348
14.1.1 数字水印的特点 349
14.1.2 图像数字水印 349
14.1.3 数字水印原理 349
14.1.4 嵌入过程 350
14.1.5 提取过程 350
14.2 相关函数 351
14.3 代码实现数字水印 354
第15章 图像加密和解密 357
15.1 图像加密和解密原理 357
15.2 相关函数 358
15.3 代码实现图像加解密 359
第16章 物体计数 361
16.1 物体计数基本原理 361
16.2 在图像上绘制文字 361
16.3 代码实现药片计数 364
第17章 图像轮廓 367
17.1 图像轮廓概述 367
17.2 应用场景 368
17.3 OpenCV中的轮廓函数 368
17.3.1 查找轮廓findContours 368
17.3.2 轮廓的基本属性 369
17.3.3 绘制轮廓drawContours 370
17.3.4 求轮廓面积contourArea 370
17.4 实战轮廓函数 371
17.5 实战黑白翻转 373
第18章 手势识别 375
18.1 手势识别概述 375
18.2 凸包和凸包检测 375
18.2.1 查找凸包的示例 378
18.2.2 凸缺陷及其意义 381
18.3 手势识别原理 387
18.4 区分手势0和1 390
18.5 区分手势2到5 392
第19章 停车场车牌识别系统 397
19.1 车牌识别技术概述 397
19.2 车牌识别技术的宏观分析 398
19.2.1 国外技术分析 398
19.2.2 国内技术分析 400
19.2.3 车牌识别技术的难点 401
19.2.4 车牌识别系统的开发思路 401
19.3 车牌定位技术 402
19.3.1 车牌特征概述 402
19.3.2 车牌定位方法 403
19.3.3 车牌图像预处理 407
19.3.4 车牌图像的灰度化 407
19.3.5 车牌图像的直方图均衡化 408
19.3.6 车牌图像的滤波 410
19.3.7 车牌图像的二值化 411
19.3.8 车牌图像的边缘检测 411
19.3.9 车牌图像的灰度映射 412
19.3.10 车牌图像的改进型投影法定位 412
19.4 车牌字符分割技术 414
19.4.1 常用车牌字符分割算法 414
19.4.2 车牌倾斜问题 416
19.4.3 车牌倾斜度检测方法 416
19.4.4 车牌倾斜度校正方法 417
19.4.5 车牌边框和铆钉的去除 417
19.4.6 车牌字符分割 417
19.4.7 基于垂直投影和先验知识的车牌字符分割 418
19.4.8 粘连车牌字符的分割 419
19.4.9 断裂车牌字符的合并 420
19.4.10 对车牌字符的切分结果进行确认 420
19.5 车牌字符识别技术 421
19.5.1 模式识别 421
19.5.2 字符识别 422
19.5.3 汉字识别 424
19.6 系统设计 424
19.7 系统拓扑结构 426
19.8 停车场端的详细设计 426
19.9 办公室端的详细设计 433
19.9.1 创建项目 433
19.9.2 设计界面 433
19.9.3 实现构造函数 434
19.9.4 文件信息类MyFileInfo 435
19.9.5 实现连接服务器函数 436
19.9.6 关联按钮槽函数 437
19.9.7 实现文件下载功能 437
19.9.8 接收文件信息 438
19.9.9 接收文件数据 440
19.9.10 图像处理相关的成员变量 441
19.9.11 实现打开文件 441
19.9.12 实现图像二值化 442
19.9.13 实现定位车牌 444
19.9.14 实现分割字符 447
19.9.15 实现识别结果 452
19.9.16 运行程序 455
正版购买
等待上架