基本信息
- 原书名:Mastering OpenCV with Practical Computer Vision Projects
- 原出版社: Packt Publishing
- 作者: (巴西)Daniel Lelis Baggio
- 译者: 刘波
- 丛书名: 华章程序员书库
- 出版社:机械工业出版社
- ISBN:9787111478188
- 上架时间:2014-9-12
- 出版日期:2014 年9月
- 开本:16开
- 页码:226
- 版次:1-1
- 所属分类:计算机 > 图形图像、多媒体、网页制作 > 综合

编辑推荐
OpenCV主要开发者和OpenCV社区的主要贡献者携手,深入解析OpenCV技术在计算机视觉项目中的应用,Amazon广泛好评。
通过典型计算机视觉项目,系统讲解使用OpenCV技术构建计算机视觉相关应用的各种技术细节、方法和最佳实践,并提供全部实现源码,为读者快速实践OpenCV技术提供翔实指导。
内容简介
作译者
目录
译者序
前 言
第1章 Android系统上的卡通化和皮肤变换 1
1.1 访问摄像机 2
1.2 桌面应用处理摄像机视频的主循环 3
1.3 生成黑白素描 4
1.4 生成彩色图像和卡通 5
1.5 用边缘滤波器来生成“怪物”模式 7
1.6 用皮肤检测来生成
“外星人”造型 8
1.6.1 皮肤检测算法 8
1.6.2 确定用户放置脸的位置 9
1.6.3 皮肤变色器的实现 10
1.7 把桌面应用移植到Android系统 14
1.7.1 安装使用OpenCV的Android项目 14
1.7.2 在Android NDK应用中添加卡通化代码 17
1.7.3 在Android系统中显示保存图像的消息 24
1.7.4 降低素描图像的随机椒盐噪声 27
1.8 总结 31
译者序
OpenCV是开源、跨平台的计算机视觉库,其全称是Open Source Computer Vision Library。它是由英特尔公司发起并参与开发的,可在商业和研究领域中免费使用。OpenCV能开发实时的图像处理、运动跟踪、目标检测等程序。
但目前通过实际应用项目来介绍OpenCV的书很少。本书通过8个典型的计算机视觉项目来介绍OpenCV强大、高效的功能。这8个项目涵盖了计算视觉的如下领域:基于iPhone或iPad的增强现实;从运动中得到3D结构;车牌识别;人脸识别与跟踪;三维头部姿态估计等。这些项目均用C/C++实现,对于关键代码,作者给出非常详细的介绍。在每章中,作者不但介绍项目的应用背景、整体框架、软件设计方法,同时也深入浅出地介绍了与项目相关的机器学习理论。毫不夸张地讲,这是一本用OpenCV来实践计算机视觉应用难得的好书。
翻译本书的过程也是我学习的过程,虽然辛苦但也不觉得累。为了做到专业词汇准确权威,书本内容正确,意译部分既不失原著意境又无偏差, 在翻译过程中查阅了大量相关资料。但由于时间和能力有限,书中内容难免存在纰漏。若有问题,读者可通过电子邮件liubo7971@173.com与我联系,欢迎一起探讨,共同进步。
本书翻译过程得到如下项目资助:(1)重庆市教委研究项目“多核正则化机器学习理论研究”,项目号:KJ130709;(2)重庆工商大学研究项目“基于多核学习的高维数据分析研究”,项目号:2013-56-09;(3)大数据稀疏表示判别字典学习及其应用技术研究项目号:KJ1400612。
感谢河南工业大学信息科学与工程学院的靳小波博士对本书翻译的支持与鼓励,也感谢我的家人,特别感谢我妻子杨雪莉和女儿刘典。虽然翻译本书占用了本应陪她们的大量时间,但她们一直包容并支持我。
前言
本书的主要内容
第1章包含一个针对桌面应用和Android应用的完整教程及相关源代码,这些应用可从真实摄像机图像中自动生成一幅卡通画或图画。在生成过程中,包括皮肤颜色变换在内的几种卡通类型可供选择。
第2章包含一个完整教程,该教程讲解如何针对iPhone或iPad设备来构建基于标记的增强现实(AR)应用,并给出每个步骤和源代码的解释。
第3章包含一个怎样开发无标记增强现实桌面应用的完整教程,并解释了无标记增强现实(AR)和其源代码。
第4章通过OpenCV实现运动中结构恢复的概念来介绍运动中的结构(SfM)。读者将学习如何从2D图像重构3D几何结构以及如何估计摄像机位置。
第5章包含一个完整教程及相关源代码,该教程是通过模式识别算法(支持向量机和人工神经网络)而建立的自动车牌识别应用。读者将学习如何训练和预测模式识别算法来判断一幅图像是否为车牌。这对通过一组特征来识别字符也有帮助。
第6章包含构建一个动态人脸跟踪系统的完整教程及相关源代码,该系统能模拟和跟踪人脸的一些复杂部位。
第7章包含理解主动外观模型(AAM)和通过OpenCV来根据有不同脸部表情的数据帧创建AAM的所有背景知识。除此以外,该章解释如何根据AAM提供的拟合能力来匹配给定帧。然后采用POSIT算法来找到3D头部姿态。
第8章包含实时人脸识别应用的完整教程和源代码,该应用包括基本的脸部和眼部检测算法,能处理图像中的人脸旋转和不同光照条件。
第9章包含一个交互式流体模拟器(称为流体墙)的完整开发流程,它采用Kinect传感器。该章将解释怎样通过OpenCV的光学流方法来使用Kinect数据并将其集成到一个流体求解算法中。请读者通过链接 http://www.packtpub.com/sites/default/files/downloads/7829OS_Chapter9_Developing_Fluid_Wall_Using_the_Microsoft_Kinect.pdf下载第9章。
阅读前的准备工作
阅读本书不需要具有计算机视觉的专业知识,但在阅读本书之前应该有良好的C / C ++编程技能和OpenCV的基本经验。没有OpenCV经验的读者不妨阅读《Learning OpenCV》来了解OpenCV的特性或阅读《OpenCV 2 Cookbook》来了解如何以受推崇的C++方式来使用OpenCV,因为本书将展示如何解决现实问题,并假定读者熟悉OpenCV和C/C++开发的基础知识。
除具有C/C++和OpenCV的经验外,读者还需要一台计算机和相应的IDE环境(例如: Visual Studio、 XCode、 Eclipse、QtCreator,它们可以运行在Windows、Mac或者Linux上)。有些章节有进一步的要求,特别是:
为了开发Android应用,读者需要一台Android设备、多种Android开发工具和基本的Android开发经验。
为了开发iOS应用,读者需要iPhone、iPad或iPod Touch设备、iOS开发工具(包含一台苹果电脑、XCode IDE、苹果开发者证书)以及基本的iOS和Objective-C的开发经验。
几个桌面项目需要一台与计算机相连的摄像机。任何普通的USB摄像机就足够了,但它至少是100万像素。
某些项目(包括OpenCV本身)会使用CMake来构建以支持跨平台和跨编译器。需要对构建系统有基本的理解,最好具有跨平台构建的知识。
需要了解线性代数方面的知识,例如:向量和矩阵的基本操作以及特征分解。
本书的读者对象
媒体评论
Android系统上的卡通化和皮肤变换
本章将介绍如何针对Android智能手机和平板电脑编写图像处理滤波器,首先在台式机上(用C/C++)实现,然后移植到Android 系统上(用C/C++实现的代码与台式机一样,但GUI用Java来编写),这是移动设备开发所推崇的方式。本章的主要内容如下:
如何将现实生活中的图像转换为素描;
如何生成彩色图画并将素描叠加上去来生成卡通画;
用恐怖的“怪物”模式来创建坏人形象;
通过基本的皮肤检测器和皮肤变色器让人脸变成绿色“外星人”皮肤;
如何将桌面应用项目转换为移动设备上的应用程序。
下面的屏幕截图来自于运行在Android平板电脑上的卡通化应用程序。
本章希望摄像机拍摄的现实世界看起来像卡通画一样。其基本思路是用某种颜色来填充平整部分,然后用粗线来绘制图像较明显的边缘。也就是说,平整区域变得更加平,而边缘应变得更加明显。可先检测边缘并对平整区域进行平滑处理,然后增加边缘并从顶部开始来产生一个卡通或漫画效果。
当开发移动设备上的计算机视觉应用时,一种好的方法是先创建一个完整的桌面应用版本,再移植到移动设备上,因为开发和调试桌面应用程序比移动应用程序要容易!因此,本章将以一个完整的卡通化桌面应用开始,读者可用自己喜欢的IDE(如:Visual Studio、 XCode、Eclipse、QtCreator等)来编写该应用。当其在PC上正确运行后,我们将在最后一节介绍如何用Eclipse将其移植到Android (或iOS)系统中。因此会创建两个不同的项目,它们会共享绝大多数源代码,但有不同的图形用户界面。可创建两个项目都可使用的库,但为了简化起见,可将桌面项目和Android项目放在一起,让Android项目通过desktop文件夹来访问一些文件(cartoon.cpp和cartoon.h,它们包含了所有图像处理代码)。例如:
C:\\Cartoonifier_Desktop\\cartoon.cpp
C:\\Cartoonifier_Desktop\\cartoon.h
C:\\Cartoonifier_Desktop\\main_desktop.cpp
C:\\Cartoonifier_Android\\...
桌面应用有一个OpenCV GUI窗口,初始化摄像机,并在处理摄像机的每帧时都调用cartoonifyImage ()函数,该函数包含了本章大多数代码。然后在GUI窗口显示被处理的图像。与之类似,Android应用程序也有一个Android GUI窗口,会用Java程序来初始化摄像机,并调用前面提到的那个用C++实现的cartoonifyImage ()函数来处理摄像机的每一帧,除此之外还有Android 菜单并支持触摸输入。本章将从头开始介绍如何创建桌面应用程序,该Android应用基于其中的一个OpenCV Android示例项目。因此,首先在读者所熟悉的IDE中创建桌面应用程序,其中,用于保存GUI代码的main_desktop.cpp文件将在下一节给出,该文件包含主循环、摄像机功能以及键盘输入,同时,还应创建两个项目共享的cartoon.cpp文件。本章大多数代码都会放在函数cartoonifyImage ()中,该函数保存在cartoon.cpp文件中。
……
书摘
Android系统上的卡通化和皮肤变换
本章将介绍如何针对Android智能手机和平板电脑编写图像处理滤波器,首先在台式机上(用C/C++)实现,然后移植到Android 系统上(用C/C++实现的代码与台式机一样,但GUI用Java来编写),这是移动设备开发所推崇的方式。本章的主要内容如下:
如何将现实生活中的图像转换为素描;
如何生成彩色图画并将素描叠加上去来生成卡通画;
用恐怖的“怪物”模式来创建坏人形象;
通过基本的皮肤检测器和皮肤变色器让人脸变成绿色“外星人”皮肤;
如何将桌面应用项目转换为移动设备上的应用程序。
下面的屏幕截图来自于运行在Android平板电脑上的卡通化应用程序。
本章希望摄像机拍摄的现实世界看起来像卡通画一样。其基本思路是用某种颜色来填充平整部分,然后用粗线来绘制图像较明显的边缘。也就是说,平整区域变得更加平,而边缘应变得更加明显。可先检测边缘并对平整区域进行平滑处理,然后增加边缘并从顶部开始来产生一个卡通或漫画效果。
当开发移动设备上的计算机视觉应用时,一种好的方法是先创建一个完整的桌面应用版本,再移植到移动设备上,因为开发和调试桌面应用程序比移动应用程序要容易!因此,本章将以一个完整的卡通化桌面应用开始,读者可用自己喜欢的IDE(如:Visual Studio、 XCode、Eclipse、QtCreator等)来编写该应用。当其在PC上正确运行后,我们将在最后一节介绍如何用Eclipse将其移植到Android (或iOS)系统中。因此会创建两个不同的项目,它们会共享绝大多数源代码,但有不同的图形用户界面。可创建两个项目都可使用的库,但为了简化起见,可将桌面项目和Android项目放在一起,让Android项目通过desktop文件夹来访问一些文件(cartoon.cpp和cartoon.h,它们包含了所有图像处理代码)。例如:
C:\Cartoonifier_Desktop\cartoon.cpp
C:\Cartoonifier_Desktop\cartoon.h
C:\Cartoonifier_Desktop\main_desktop.cpp
C:\Cartoonifier_Android\...
桌面应用有一个OpenCV GUI窗口,初始化摄像机,并在处理摄像机的每帧时都调用cartoonifyImage ()函数,该函数包含了本章大多数代码。然后在GUI窗口显示被处理的图像。与之类似,Android应用程序也有一个Android GUI窗口,会用Java程序来初始化摄像机,并调用前面提到的那个用C++实现的cartoonifyImage ()函数来处理摄像机的每一帧,除此之外还有Android 菜单并支持触摸输入。本章将从头开始介绍如何创建桌面应用程序,该Android应用基于其中的一个OpenCV Android示例项目。因此,首先在读者所熟悉的IDE中创建桌面应用程序,其中,用于保存GUI代码的main_desktop.cpp文件将在下一节给出,该文件包含主循环、摄像机功能以及键盘输入,同时,还应创建两个项目共享的cartoon.cpp文件。本章大多数代码都会放在函数cartoonifyImage ()中,该函数保存在cartoon.cpp文件中。
1.1访问摄像机
可简单调用cv::VideoCapture对象的open ()方法(它是访问摄像设备的OpenCV方法)来访问计算机的摄像头或摄像机。将默认的摄像机编号0传递给此函数。一些计算机有多个摄像机或将0作为默认摄像机编号使程序不能运行,解决这类问题的通常做法是将用户指定摄像机编号作为命令行参数,比如:若想指定摄像机编号为1、2或-1,这种方法就比较恰当。
为了让程序在高分辨率摄像机上运行得更快,可用cv::VideoCapture::set()将摄像机的分辨率设为640×480。
注意:由于摄像机的模式、驱动,或操作系统不同,OpenCV可能无法改变某些摄像机属性,这对本项目不重要,因此摄像机的属性无法修改也不要担心。