OpenCV教程——基础篇
Wikipedia,自由的百科全书
OpenCV教程——基础篇
- 页数:433
- 配盘:光盘
- 定价:49元
- 作者:刘瑞祯 于仕琪
- 书号:978-7-81124-035-1
- 出版日期:200706
- 开本:787×1092 1/16开
- 字数:710千字
目录 |
内容简介
目前,OpenCV逐步成为一个通用的基础研究和产品开发平台。本书是国内第一本全面介绍OpenCV的中文版图书,对OpenCV开放源代码计算机视觉库进行了详细讲解。OpenCV由一系列 C函数和C++类构成,功能涵盖图像处理、计算机视觉和模式识别等领域。OpenCV实现了大量通用算法,涉及到图像处理、结构分析、运动检测、摄像机定标、三维重建以及机器学习等方面,并有较高的运行效率。书中所有实例均提供了C/C++语言的源代码。
本书附光盘1张,内容包括 OpenCV 1.0 分别在Windows和Linux下的安装程序,以及书中所有实例的源代码。
本书可作为信息、图像处理和模式识别等领域的高年级本科生、研究生的教学用书,也可作为学生课题项目、科研项目以及公司产品开发的参考手册。
前言
OpenCV这一名称包含了Open和 Computer Vision两者的意思。实际上,Open指Open Source(开源,即开放源代码),Computer Vision则指计算机视觉。OpenCV的发展对软件的开发具有重要影响。
(1) 开放源代码 开放源代码(open source)是信息技术界从20世纪80年代开始兴起的新名词。源代码是由软件命令电脑执行指定动作的程序语句,是一个软件的核心所在。最著名的开放源代码软件,当属芬兰人林努斯•托尔瓦兹提出的Linux。开放源代码软件之所以能够风靡世界,首先是其开源的免费特性;此外,由于有全球众多编程者的参与,开源软件一般具有简约精炼、资源占用少、功能集中和安全性好的特点。
从长远来讲,开放源代码或许是一种效率更高、效果更好的软件商业模式。这也是为什么很多商业软件巨头,开始逐步关注开源模式,并参与其中。因为开源,不仅仅使软件比较便宜,它更是一种转变,一种建造当代软件公司发展模式的运动。
(2) 计算机视觉
计算机视觉(computer vision)是在数字图像处理的基础上发展起来的新兴学科,它从信息处理的层次研究视觉信息的认知过程,研究视觉信息处理的计算理论和表达与计算方法,包括图像特征提取,摄像机定标,立体视觉,运动视觉(或称序列图像分析),由图像灰度恢复三维物体形状的方法,物体建模与识别方法以及距离图像分析方法等方面。作为一门综合性的交叉学科,计算机视觉处理的领域涉及到计算机科学与工程、信号处理、物理学、应用数学与统计学以及神经生理学与认知科学等方面,并在制造业、检验、文档分析、医疗诊断和军事等领域的各种智能/自主系统中有着广泛的应用。
(3) Intel资助的开源项目——OpenCV
或许人们奇怪,Intel公司竟然会资助一个开源项目,这似乎不符合一个跨国公司追求商业利润最大化的做事风格。但是,OpenCV确实是在 Intel公司的鼎力资助下,才得到长足和有保障的发展。这是因为开源作为今后软件的发展模式,必将给现有的高技术企业带来巨大的潜在利益。目前,以 Linux为代表的开放源代码软件得到了HP,IBM,Sun,Intel和Novell等世界上几乎所有大计算机软、硬件厂商的重视和支持,他们纷纷启动了开发和使用开放源代码软件的项目。因为开源已经日益成为一个不可阻挡的世界潮流,无论从软件开发本身还是技术趋势来看,开放的、有众多志愿者参与的开源项目,都会大大促进产品和技术的发展,并带来巨大的潜在商业价值。
OpenCV作为开放的数字图像处理和计算机视觉软件平台,有以下特点:
- ① 开放C源码。
- ② 基于Intel处理器指令集开发的优化代码。
- ③ 统一的结构和功能定义。
- ④ 强大的图像和矩阵运算能力。
- ⑤ 方便灵活的用户接口。
- ⑥ 同时支持MSWindows和Linux平台。
作为一个基本的计算机视觉、图像处理和模式识别的开源项目,OpenCV可以直接应用于很多领域,作为二次开发的理想工具。
本书的由来笔者从开始接触OpenCV到现在,已经有很长时间了。记得当时在中科院读博士时,主要使用MATLAB进行算法原型的设计和验证。为了开发演示系统,也为兴趣起见,一直在寻找一种好的、具有类似MATLAB功能的、在图像处理/计算机视觉/模式识别等领域中使用的C/C++基础开发平台。从有名的卡耐基梅隆大学(CMU)的计算机视觉主页(http://www.cs.cmu.edu/~cil/vision.html )以及开源网站 sourceforg.net,到网络上曾经寻找过数不胜数的各种源代码开发包。当时试图把每一个可以下载的源代码都运行一遍,可谓是“上穷碧落下黄泉,两处茫茫皆不见”,一直没有找到合适和满意的。究其原因不外乎是: 大量开发包都是由业余爱好者自己编写的、凭兴趣或者自己开发的项目,其最大缺点是不规范,缺乏后续的开发和改进能力。直至找到OpenCV,才有眼睛一亮的感觉。
第一次下载的OpenCV的版本是Beta 2.1版。那时感觉OpenCV能够吸引我的地方是,除了它具有必要的功能外,最主要的是它有一个 Yahoo Group,在上面有很多参与者,与众人一起讨论学习,可以不断提高自己、增长知识。后来逐步接触了OpenCV的各个升级版本,也陆续在上面做了不少开发。从几年前翻译OpenCV用户手册开始,到建立自己的第一个OpenCV方面的博客,笔者就一直有一种想法,希望能够在中国推广 OpenCV。为什么很多好的开源项目,都是在国外的土壤上发展壮大,而国内却非常少?几年的经历使我发现大致是因为国内的生存和竞争压力太大,自己又何尝不是如此呢!
最近一段时间,重新下定决心来写点东西,希望能够对OpenCV在国内的推广有所裨益,一些内容也会陆续放到博客上(http://blog.csdn.net/hunnish ),对于很多喜欢在网上看书的人,可以直接从博客下载相关内容。
本书的宗旨
本书力求做到: • 全面反映OpenCV最新版本的通用功能,淡化某些理论性较强的专用功能。 • 着力描绘各个函数的使用方法,简化函数用法的解释。 • 多举实例,以有利于不熟悉C/C++语言和计算机视觉、数字图像处理的读者进行学习,寓教于例,由浅入深,使他们能够体会到OpenCV带来的成功快乐。 • 诚实面对读者,所有实例都经过编译运行。 • 为方便读者学习和使用,随书光盘包含了全书的所有源代码以及VC6.0的工程文件,读者可以直接编译运行。
本书以OpenCV入门为目的,希望抛砖引玉,为那些对OpenCV感兴趣以及刚刚开始接触OpenCV的人使用,以消除他们在接触一个新事物时所产生的陌生感。
本书没有深入讲解OpenCV中很多算法所涉及的理论知识,因为这些理论知识已经大大超出本书的范围,如果需要了解这些理论,最好的方法是查阅相关论文以及教科书。本书只是说明如何使用这些函数,因此,只力求使读者对OpenCV中的模式识别和图像处理等方面的函数,知其然而不必知其所以然。
全书的结构
全书分6章,另有附录A~C,并提供光盘一张。其中,第2章的部分内容和第6章由于仕琪完成,其余部分由刘瑞祯完成。
第1章概述了OpenCV及其实现的功能。
第2~6章的内容遵循“由浅入深”、“相对独立”和“算例引导”原则来安排。从全书整体看,概念相对简单的篇章安排在前;复杂的函数和概念安排在后,并尽量用实例来说明。为了节约篇幅,绝大部分实例采用命令行程序的形式提供,这样有助于读者避免图形界面程序的干扰,而直接了解OpenCV的内核。 • 第2章OpenCV入门专门介绍OpenCV最基本的使用方法,主要针对以前没有接触过OpenCV的读者。因此对程序的安装、配置、编译、运行、基本项目的创建以及基本函数库的构建给出了尽可能详细的解释。 • 第3章OpenCV基础系统阐明OpenCV的数据结构、函数使用方法、GUI以及矩阵和图像的操作与显示,并详细讲解视频流在OpenCV中的操作方法。配合大量实例,读者可以通过本章的学习对OpenCV有一个全面而基本的认识。请读者千万不要轻视本章的内容,因为它快速而全面地介绍了 OpenCV,是今后开发和学习OpenCV的基础。 • 第4章数据结构与数据操作对OpenCV中涉及到的各类数据结构及其相应的操作方法做进一步说明。本章内容建立在OpenCV英文参考手册之上,所有的函数参数以及调用方式,都是根据OpenCV V1.0版本翻译编写的;在升级版本出来之后,有些函数的调用方式也许会发生相应改变,敬请读者注意。 • 第5章模式识别与图像处理本章实际上是对OpenCV中涉及到模式识别与数字图像处理方面的函数做一个综合阐述,其主要部分也建立在OpenCV英文用户参考手册之上。本章涉及的很多函数需要大量的理论和专业背景知识作基础,因此对这些函数只是阐述了使用方法,并用适当实例来说明,而没有详细讨论算法的基本知识,因为这些知识已经大大超出了本书范围。 • 第6章运动物体跟踪这是一个实际项目,说明如何利用OpenCV来实现运动物体的智能监控与跟踪。读者可以通过本章的学习对OpenCV有一个实际的开发体验。 附录A~C包括样例索引、附图索引以及函数索引,以方便读者查阅书中相关内容。
本书的读者对象和使用建议
本书可作为信息处理、计算机、机器人、人工智能、遥感图像处理和认知神经科学等相关专业的本科高年级学生或研究生的教学用书,也可供以上领域的产品开发人员和研究工作者参考。
本书内容的自封闭性、算例和完善的检索系统及随书光盘,使本书既能作为教材或自学用书,又能作为实践OpenCV的开发手段。计算机视觉自身具有的很强的综合性决定了本书有较大的知识跨度。其中最主要的两点是:第一,读者应该有良好的C/C++编程基础,因为作为研究人员以及软硬件工程师,编程是必不可少的基本功;第二,书中涉及的相关模式识别和数字图像处理的相关内容,希望读者尽量结合相关教科书和参考书,从“知其然”开始,逐步过渡到“知其所以然”。作者在编写本书时,充分考虑了OpenCV的这种特点,也考虑了多方面读者的不同层次需要,配置了大量的样例程序,因此无论读者原来的知识背景如何,只要循着样例进行操作,就能直观地感受到其运行结果。
致谢
虽然本书从有想法到最终开始动手之间的时间很长,然而成书的时间却不到一个月。这当然要感谢很多曾经对本书做出贡献的人——樊臻涛、张红梅、魏育成、张兆翔、张艳秋、谭俊河和柳明等。他们的工作使本书很快完成。
另外,也要感谢北京航空航天大学出版社。感谢该社为本书所做的一切工作,也感谢赵延永老师、宋淑娟老师对作者编写本书所给予的鼓励、理解和支持。
在本书结稿的此时此刻,要感谢我的妻子李秀娟,她对我的事业和生活给予一如既往的支持,在回国的几年里,是她给予我生活和工作的信心。同时也衷心感谢我的父母和家人,当我因事业而到处奔波时,他们给我营造了一个温馨而平静的家庭港湾,让我能够义无反顾地追求自己的梦想。
时值2006年的圣诞之夜,此书也算是我奉献给大家的圣诞礼物吧。
刘瑞祯
2006年12月24日夜于北京
目录
- 第1章 概述
- 第2章 OpenCV入门
- 2.1 下载OpenCV6
- 2.2 VC6.0下安装与配置6
- 2.2.1 安装OpenCV6
- 2.2.2 安装DirectX SDK8
- 2.2.3 编译OpenCV9
- 2.2.4 设置VC6.0环境9
- 2.2.5 在项目中运用OpenCV10
- 2.2.6 以Makefile方式编译程序10
- 2.3 VC.net 2003下安装与配置11
- 2.3.1 定制全局选项11
- 2.3.2 创建新项目13
- 2.4 VC 2005 Express下安装与配置15
- 2.4.1 安装VC 2005 Express15
- 2.4.2 安装Microsoft Platform SDK15
- 2.4.3 配置VC 2005 Express15
- 2.4.4 建立OpenCV项目16
- 2.5 Linux环境下的安装18
- 2.5.1 下载源码18
- 2.5.2 解压文件18
- 2.5.3 检查软件配置18
- 2.5.4 编译OpenCV19
- 2.5.5 安装OpenCV19
- 2.5.6 更新动态链接库20
- 2.6 Debian下安装20
- 2.7 创建OpenCV控制台项目20
- 2.8 在MFC中使用OpenCV23
- 2.8.1 创建新项目23
- 2.8.2 设置OpenCV环境23
- 2.8.3 分步创建MFC例程26
- 2.8.4 读入图像并显示处理29
- 2.8.5 在MFC窗口中显示图像34
- 2.9 创建OpenCV的静态链接库35
- 2.9.1 生成CXCOREL的工程文件35
- 2.9.2 生成CXCOREL的调试版静态库37
- 2.9.3 生成CXCOREL的正式版静态库39
- 2.9.4 生成CV/CVAUX/HIGHGUI的静态库41
- 2.9.5 独立发布的运行程序42
- 第3章 OpenCV基础
- 3.1 OpenCV命名规则 46
- 3.2 基本数据结构47
- 3.3 矩阵的使用与操作47
- 3.3.1 分配与释放矩阵48
- 3.3.2 访问矩阵元素49
- 3.3.3 矩阵和向量操作49
- 3.4 GUI命令60
- 3.4.1 窗口管理60
- 3.4.2 输入处理61
- 3.5 图像的使用与操作63
- 3.5.1 分配和释放图像63
- 3.5.2 图像的读写65
- 3.5.3 访问图像元素67
- 3.5.4 图像转换69
- 3.5.5 绘制命令70
- 3.6 视频的使用与操作76
- 3.6.1 从视频序列中捕捉图像帧76
- 3.6.2 获取视频帧信息78
- 3.6.3 保存视频文件79
- 3.7 对摄像头和视频流的使用与操作80
- 3.7.1 一般用法80
- 3.7.2 选择摄像头81
- 3.7.3 视频流的处理82
- 3.7.4 获取摄像头属性83
- 3.7.5 视频帧的处理83
- 3.7.6 处理AVI文件83
- 3.7.7 Linux下使用多摄像头84
- 3.7.8 Windows下使用多摄像头84
- 3.7.9 CVCAM的属性界面84
- 第4章 数据结构与数据操作
- 4.1 基础结构86
- 4.1.1 CvPoint86
- 4.1.2 CvPoint2D32f86
- 4.1.3 CvPoint3D32f87
- 4.1.4 CvSize87
- 4.1.5 CvSize2D32f87
- 4.1.6 CvRect87
- 4.1.7 CvScalar88
- 4.1.8 CvTermCriteria88
- 4.1.9 CvMat89
- 4.1.10 CvMatND89
- 4.1.11 CvSparseMat90
- 4.1.12 IplImage90
- 4.1.13 CvArr92
- 4.2 数组操作92
- 4.2.1 初始化92
- 4.2.2 获取元素和数组子集104
- 4.2.3 复制和添加111
- 4.2.4 变换和置换113
- 4.2.5 算术、逻辑和比较运算117
- 4.2.6 统计130
- 4.2.7 线性代数133
- 4.2.8 数学函数147
- 4.2.9 随机数生成151
- 4.2.10 离散变换154
- 4.3 动态结构162
- 4.3.1 内存存储162
- 4.3.2 序列167
- 4.3.3 集合183
- 4.3.4 图186
- 4.3.5 树195
- 4.4 绘图函数197
- 4.4.1 曲线与形状198
- 4.4.2 文本202
- 4.4.3 点集和轮廓204
- 4.5 数据保存和运行时类型信息208
- 4.5.1 文件存储208
- 4.5.2 写数据212
- 4.5.3 读取数据217
- 4.5.4 运行时类型信息和通用函数224
- 4.6 其他混合函数227
- 4.7 错误处理和系统函数232
- 4.7.1 错误处理232
- 4.7.2 系统函数239
- 第5章 模式识别与图像处理
- 5.1 图像处理243
- 5.1.1 梯度、边缘和角点243
- 5.1.2 采样、插值和几何变换253
- 5.1.3 形态学操作262
- 5.1.4 滤波器与彩色变换268
- 5.1.5 金字塔及其应用278
- 5.1.6 连接部件279
- 5.1.7 图像与轮廓矩296
- 5.1.8 亮度变换与直方图298
- 5.1.9 特殊图像变换315
- 5.1.10 匹配326
- 5.2 结构分析329
- 5.2.1 轮廓处理函数329
- 5.2.2 计算几何333
- 5.2.3 平面划分346
- 5.3 运动分析与对象跟踪357
- 5.3.1 背景统计量的累积357
- 5.3.2 运动模板361
- 5.3.3 对象跟踪368
- 5.3.4 光流375
- 5.3.5 预估器378
- 5.4 目标检测385
- 5.5 摄像机定标和三维重建393
- 5.5.1 针孔摄像机模型和变形393
- 5.5.2 摄像机定标394
- 5.5.3 姿态估计400
- 5.5.4 对极几何402
- 第6章 运动物体跟踪
- 6.1 基本结构406
- 6.1.1 团块406
- 6.1.2 团块列表406
- 6.1.3 团块跟踪参数407
- 6.2 模块描述408
- 6.2.1 前景检测模块408
- 6.2.2 新团块检测模块408
- 6.2.3 团块跟踪模块409
- 6.2.4 轨迹生成模块411
- 6.2.5 轨迹后处理模块411
- 6.2.6 跟踪流程模块412
- 6.3 运动跟踪例程413
- 6.3.1 打印帮助413
- 6.3.2 分析输入参数414
- 6.3.3 打开视频415
- 6.3.4 打印参数415
- 6.3.5 创建所需要的模块415
- 6.3.6 处理视频416
- 6.3.7 例程使用416
- 6.3.8 小结418
- 6.4 添加自定义模块418
- 6.4.1 新算法代码编写418
- 6.4.2 新算法加入到框架420
- 6.4.3 运行新程序421
- 附录A 实例检索
- 附录B 附图检索
- 附录C 结构和函数检索


