OpenCV实例精解(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-09 11:01:06

点击下载

作者:(美)普拉蒂克·乔希(PrateekJoshi)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

OpenCV实例精解

OpenCV实例精解试读:

前言

OpenCV是开发计算机视觉应用最流行的库之一。它使我们能够实时运行许多不同的计算机视觉算法。它已经存在了很多年,并成为这个领域的标准库。OpenCV的主要优点之一是它的高度优化和几乎可以在所有平台上兼容。

本书首先介绍了计算机视觉中的各个领域和在C++中相关的OpenCV功能。每章都包含真实世界的例子和示例代码帮助你轻松地掌握主题,并了解它们在现实生活中的应用。总之,本书是一部实用指南,会教你如何在C++中使用OpenCV,并建立各种应用程序。本书的主要内容

第1章涵盖各种操作系统的安装步骤,介绍了人类视觉系统,以及计算机视觉中的各种主要内容。

第2章讨论如何在OpenCV中读/写图像和视频,并且介绍如何使用CMake建立一个项目。

第3章介绍如何通过创建一个图形用户界面和鼠标事件检测器来实现交互式应用程序。

第4章探讨直方图和滤波器,也演示了如何卡通化图像。

第5章描述了各种图像的预处理技术,如去除噪声、阈值化,以及轮廓分析。

第6章处理对象识别和机器学习,并学习如何使用支持向量机建立一个对象分类系统。

第7章讨论了人脸检测和Haar级联,并解释如何使用这些方法来检测人脸的各个部分。

第8章探索背景差分、视频监控和形态学图像操作,并描述了它们如何彼此关联。

第9章介绍如何使用不同的技术跟踪对象,如基于颜色和基于特征。

第10章介绍光学字符识别、文本分割和Tesseract OCR引擎。

第11章深入研究Tesseract OCR引擎,介绍如何将它应用于文本检测、提取和识别。你需要准备什么

本书的例子会用到以下技术:

·OpenCV 3.0或更新的版本

·CMake 3.3.x或更新的版本

·Tesseract

·Leptonica(Tesseract依赖包)

·QT(可选)

·OpenGL(可选)

相关章节提供了详细的安装说明。本书的读者对象

本书面向OpenCV初学者,以及希望在C++中使用OpenCV进行计算机视觉应用开发的开发人员。懂得C++的基础知识将有助于理解本书。本书对于想要开始学习计算机视觉,并了解基本概念的人来说同样适用。他们应该知道基本的数学概念,如向量、矩阵、矩阵乘法,等等,这样才能最大限度地利用本书。在阅读本书的过程中,你将从头学习如何使用OpenCV创建各种计算机视觉应用。下载示例代码

可登录http://www.hzbook.com,下载本书示例代码。第1章OpenCV的探险之旅

计算机视觉应用是很有趣也很有用的,但是它的基础算法是计算密集型的。伴随着云计算的到来,我们拥有越来越多处理这种算法能力。在实际情况下,OpenCV库可以更有效地运行计算机视觉算法。它已经存在很多年了,并且已经成为这个领域的一个标准库了。OpenCV的一个主要优势是它已经被高度优化,并且几乎支持在所有平台上使用。这本书即将介绍OpenCV的方方面面包括:我们使用的算法,为什么使用OpenCV,以及怎么整合OpenCV到各个领域。

本章下面将要介绍如何在多操作系统环境下安装OpenCV。OpenCV提供的可以立即使用的功能有哪些,以及可以使用内置函数做到的事情。

在本章结束时候,你可以回答出以下几个问题:

·人们怎么处理视觉数据,以及怎么理解图像内容?

·OpenCV可以做些什么,在OpenCV提供的大量模块中哪些可以用来完成这些事情?

·如何在Windows、Linux以及Mac OS X上安装OpenCV?1.1 理解人类视觉系统

在接触OpenCV功能之前,我们首先需要了解这些功能为什么要创建。了解人类视觉系统的工作原理是很重要的,因为只有这样你才能够开发出正确的算法。计算机视觉算法的目的是理解图像和视频的内容。人类似乎可以毫不费力地做到这一点!那么,如何使机器也具有同样的准确性呢?

接下来,看看下面的图:

人类的眼睛会同时捕获色彩、形状、亮度等信息。在上图中,人眼捕获了这两个主体的所有信息,并以某种方式将它们存储起来。一旦明白了人类的视觉系统是如何工作的,我们就可以利用这个来实现预期结果。举个例子,下面有几件事情需要知道:

·人类视觉系统对低频内容敏感程度高于高频内容。低频内容是指像素值不迅速改变的平面区域,高频内容是指像素值波动很大的角落和边缘地区。你可能已经注意到,如果在平坦的表面有斑点,就可以很容易地被发现,但是如果在质地不平的表面就很难被发现。

·人眼对亮度的变化敏感程度高于颜色的变化。

·人类视觉系统对运动的事物很敏感。如果有东西在视野中移动,即使人们没有直视它,也能很快地意识到。

·人们往往会用心记住视野内突出的点。下面来想象一下,有一个白色的桌子,它的四条腿是黑色的,并且表面的某个角落上有一个红点。当看着这张桌子时,你会立即记住表面和腿有对立的颜色,并且其中一个角落有一个红点。人类大脑是很聪明的!它会立即做这些,以便下次遇到的时候能够对其进行快速识别。

为了解人类视野,接下来看看人类看不同事物的角度:

人类视觉系统实际上能够做更多的事情,但这样足以开始下面的内容了。你可以通过在互联网上阅读人类视觉系统模型来深入探索它。1.2 人类是怎么理解图像内容的

环顾四周,你会看到很多对象。每天可能会遇到各种各样的对象,但你会毫不费劲地一眼识别出它们。事实上,当看到一张椅子,你不会等待几分钟才意识到那是张椅子。对,你会立马意识到那是张椅子。实际上从另一方面说,计算机很难做好这件事。研究者们进行了多年研究才找出为什么计算机不擅长做这种人类相当擅长的事情。

为了得到这个问题的答案,首先要理解人们是怎么做到的。视觉数据处理发生在腹侧视觉通路。这个腹侧视觉通路涉及与对象识别相关联的人类视觉系统回路。这是人类大脑中一块区域的基本层次结构,它会有助于对象识别。人们可以毫无费劲地认知不同事物,并且还可以将相似的对象归类成组。之所以可以做到这个,是因为人类开发对相同类别对象的不变性排序。当人们观察某个对象时,他们的大脑提取了一些特征点,例如方向、尺寸、观点,以及不要紧的光照等因素。

比正常大一倍尺寸并且倾斜45度角放着的椅子仍然是一张椅子。因为处理方式的原因,我们可以很轻松地识别出它。机器反而不能轻松处理好这样的情况。人们趋向于通过形状和一些重要的特征记忆一个对象。不管这个对象是如何摆放的,人们仍然可以认出它。在人类视觉系统中,大脑创建了可以帮助我们的稳健有关位置、缩放和角度方面的不变性层次结构。

如果你对人类视觉系统有深入研究,就会发现人们有很多细胞在视觉皮层。这些细胞可以识别出曲线和直线等形状。当深入腹侧通路时,我们会看到更复杂的细胞。这些细胞被训练去反应更为复杂的事物,例如树和门等。人类腹面通路中的神经元会在感觉域上显示尺寸增长。这也与加上它们首选的刺激的复杂性地增加的事实相关联。

为什么机器很难理解图像内容

现在,我们理解了视觉数据是怎么进入人类视觉系统,以及人类视觉系统怎么处理它。目前的问题是还没理解透彻人类大脑如何识别和组织这些视觉数据。人们仅从图像中提取出一些特征,并且要求计算机通过机器学习算法学习人类。仍有很多变化例如形状、尺寸、观点、角度、光照、遮挡等。例如,在机器眼里,同样的椅子从侧面看起来不一样。不管它如何呈现,人们可以很容易地识别出它是一张椅子。但是应该如何跟计算机解释这个呢?

一种处理方法是将一个对象不同的变化存储起来,包括大小、角度、光照等。但是这样处理过于麻烦又太耗时。而且事实上,它不能将能遇到的每一种变化数据收集起来。为了识别出这些对象,计算机会消耗大量内存和时间去构建模型。即使能满足所有这些,当存在特殊遮挡的,计算机仍不能够识别出它,因为计算机会认为它是一个新事物。所以,在构建一个计算机视觉库时,我们需要构建基本功能块,那样就可以在各种各样的情况下结合成复杂的算法。OpenCV提供了很多功能,并且这些功能得到了很好的优化。所以,一旦理解OpenCV提供的立即使用方法,我们就可以高效地使用它创建有趣的应用。OpenCV的方法将在下一章具体介绍。1.3 OpenCV可以做什么

使用OpenCV,你可以做相当多能够想象出的计算机视觉任务。现实生活中的问题需要使用很多函数块来完成预期结果。所以,还需要理解哪些模块和函数能达到预期的效果。下面开始介绍OpenCV提供的可以立即使用的方法。1.3.1 内置数据结构和输入/输出

OpenCV中最利好的消息是它提供了大量内置基元去处理涉及图像处理和计算机视觉的操作。如果从零开始写一些东西,你需要定义一些对象包括图像、点、矩形等。这些几乎是任何计算机视觉算法的基础。OpenCV提供了这些可以立即使用的基本框架,并且在核心模块中包含了它们。另一个优势是这些基本框架已经在运行速度和内存使用上进行了优化,所以不需要担心实现细节。

imgcodecs模块处理图像文件的读写。当处理写入图像和创建图像文件时,你可以通过简单的命令将图像保存为JPG或者PNG格式的文件。当使用摄像机的时候,需要处理大量的视频文件。videoio模块可以处理视频文件所有读写相关的操作。你可以很容易地从摄像头中获取视频,或者读取不同种格式的视频文件。甚至可以通过设置每秒帧播放速度、帧的大小等属性将一大堆的帧保存为视频文件。1.3.2 图像处理方法

当编写计算机视觉算法时,会有一堆能反复使用的基本图像处理操作。imgproc模块展示了大部分函数。你可以处理例如图像滤波,形态学操作,几何变换,色彩变换,绘制图像,结构分析,直方图,形状分析,运动分析,特征检测等事情。接下来思考下面的图:

右图是左图的一个旋转的版本,可以通过OpenCV中的一行代码做到这种转换。OpenCV有个叫作ximgproc的模块,它包含了高级图像处理算法,例如基于结构森林的边缘检测,域变换滤波,自适应流形滤波等。1.3.3 构建GUI

OpenCV提供了一个叫作highgui的模块,它是用来处理高级用户交互操作的。在处理下一步之前,讨论处理的问题和想要检查图像的样子。这个模块包括了创建用于展示图像或者视频的窗口等一系列函数。它还包括等待功能,那是等到用户触发键盘上按键才能进行下一步。还有一个函数可以检测鼠标移动,它对开发交互应用很有帮助。使用这个功能就可以在输入窗口中绘画出长方形,处理被选择的区域。

考虑如下图:

从图中可以看出在图像上绘制了一个长方形,并且提供了一个底片影响那个区域。一旦有了这个长方形的坐标,我们就可以仅处理这块区域。1.3.4 视频分析

视频分析包括了如下任务,例如分析视频中的连续帧之间的运动,跟踪视频中的不同对象,创建视频监控模型等。OpenCV提供了video模型,它可以处理上面种种问题。还有个videostab模型用于视频去抖动。视频去抖动是摄像机中的一个重要组成部分。当用手举起相机捕捉视频,你很难保持手保持绝对静止。事实上,当观看这个视频时,会发现它看上去很差、摇摇晃晃的。所有现代设备在最后将视频展现给用户之前均使用了视频去抖动技术处理视频。1.3.5 三维重建

三维重建是计算机视觉中的一个重要课题。通过使用相关算法,就可以将一系列的二维图像重建出三维场景。OpenCV提供了可以发现二维图像中大量事物的相关联性来计算它们三维位置的算法。calib3d模块可以处理所有这些。这个模块同样处理摄像机标定,它是一个相机的必要估计参数。这些参数是基本的内在参数,这些内在参数主要是将相机拍摄到的捕捉幕转化为图像。需要知道这些参数以便设计算法,否则会得到意想不到的结果。接下来看下面的图:

上图从不同角度捕捉相同的对象。接下来的任务就是通过2D图像重建原始对象。1.3.6 特征提取

正如之前讨论的,人类视觉系统趋向于从一个给予场景中提取特征点,这样可以方便以后检索。为了模仿这点,人们开始设计很多特征提取器,目的是为了从已知图像上提取这些特征点。一些流行的算法包括SIFT(尺度不变特征变换)、SURF(加速鲁棒特征)和FAST(加速分段测试特征)等。features2d模块提供了检测和提取这些特征的函数。xfeatures2d模块提供了一些更多的特征提取器,其中一些还在实验中。如果想挑战,你可以试试这些试验中的特征提取器。其中一个叫作bioinspired的模块提供了计算机视觉仿生模型方面的算法。1.3.7 目标检测

目标检测是指在给定图像中检测目标的位置。这一过程不关心目标的类型。如果设计一个椅子检测器,它只会告诉你在给定图像中椅子的位置,而不会告知是张红色高背椅子还是低背蓝色椅子。检测目标的位置是许多计算机视觉系统中非常关键的一步。考虑下图:

如果在这张图像上运行椅子检测器,它会在所有的椅子周围加上绿框。它不会告知椅子的种类!目标检测过去常常是计算密集型的任务,因为在不同尺度下执行检测需要大量的计算。为了解决这个问题,Paul Viola和Michael Jones在他们的2001年的开创性论文中发明了伟大的算法。你可以在https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf上阅读到这篇论文。他们提供快速的方法来设计针对任何对象的目标检测器。OpenCV中的objdetect和xobjdetect两个模块已提供了设计目标检测器的框架。你可以使用它们开发任意物品的检测器,如墨镜、靴子等。1.3.8 机器学习

计算机视觉使用各种机器学习算法来实现不同的事情。OpenCV提供了ml模块,它已经捆绑了很多机器学习算法。这些算法包括贝叶斯分类器(Bayes Classifier)、K邻域(K-Nearest Neighbors)、支持向量机(Support Vector Machine)、决策树(Decision Trees)、神经元网络(Neural Networks),等等。还有一个叫作flann的模块,它包含大数据集的快速最近邻搜索算法。机器学习算法广泛用于目标识别、图像分类、人脸检测、视觉搜索等系统构建。1.3.9 计算摄影

计算摄影是指使用先进的图像处理技术来优化相机拍摄的图像。计算摄影使用软件来处理可视化数据,而不是专注于光学处理和图像捕获方法。一些应用程序包括高动态范围成像、全景图像、图像光照、光场相机,等等。

接下来,看以下图像:

这是动态范围图像的例子,如果使用常规图像捕获技术就不可能得到它。为此,必须在多重曝光下捕获相同的场景,彼此注册这些图像,然后很好地将它们混合,并创建这幅图。photo和xphoto模块包含各种有关计算摄影的算法。stitching模块提供创建全景图像的算法。前面的图像可以在https://pixabay.com/en/hdr-high-dynamic-range-landscape-806260/上找到。1.3.10 形状分析

形状的概念是计算机视觉的关键。可以通过认识到各种图像不同的形状来分析可视化数据。实际上,这是许多算法的重要一步。比如,试图识别图像中的特定标志。现在,你应该清楚它可以以各种形状、方向、大小展现出来。一个好的起点是量化对象形状特征。shape模块提供提取不同的形状,衡量它们间的相似点,起点变换目标形状等算法。1.3.11 光流算法

光流算法用于跟踪在视频的连续帧中的特征。比如,你想要跟踪视频中的特定对象。在每个帧上运行特征提取将会消耗大量计算资源;因此,这一处理会很慢。所以,仅需要从当前帧中提取特征,然后在连续帧上跟踪这些特性。光流算法被广泛使用在基于视频的计算机视觉应用。optflow模块包含执行光流所需的大量算法。tracking模块包含了跟踪特征的很多算法。1.3.12 人脸识别和目标识别

人脸识别是指识别给定的图像中的人。这和识别给定的图像中人脸的位置的人脸检测不同。所以,如果你想要建立一种实用的生物特征识别系统可以识别镜头前的人,你首先需要进行人脸检测来确定脸的位置,然后,进行人脸识别以辨认出这是谁的脸。face模块调用处理人脸识别。

如前文所述,计算机视觉试图将基于人类是如何感知可视化数据的算法模型化。因此,它有助于查找特征区域和图像中的目标。它可以在如目标识别、目标检测和跟踪等方面帮助不同的应用程序。saliency模块为此而设计,它提供了能够检测静态图像和视频中特征区域的算法。1.3.13 曲面匹配

我们越来越多地需要与捕获周围对象的三维结构的设备进行交互。这些设备基本上捕获了常规二维彩色图像的深度信息。因此,构建理解和处理三维目标的算法是至关重要的。Kinect是设备捕获可视化数据深度信息的好例子。手头的任务是通过三维目标与在我们的数据库模型的匹配来识别输入这个目标。如果有一个系统可以识别和定位目标,那么它可以应用于许多不同的应用程序。surface_matching模块包含三维对象识别和使用三维特征进行位置估计的算法。1.3.14 文本检测与识别

给定场景中的文本鉴定和内容识别变得越来越重要。一些应用程序包括铭牌识别、自动驾驶汽车识别道路标志,图书扫描转化数字内容等。text模块包含处理文本检测与识别的各种算法。1.4 安装OpenCV

接下来介绍下如何在多系统中设置和运行OpenCV。1.4.1 Windows

为方便起见,接下来使用预生成的库来安装OpenCV。先去http://opencv.org网站下载最新版本的Windows。当前版本是3.0.0,可以去OpenCV首页获得最新的链接来下载软件包。

在继续之前,需要确保你有管理员权限。下载的文件将是可执行的文件,所以只要双击它即可开始安装过程。安装内容将会扩展到一个文件夹中。你能够选择安装路径和通过检查文件来检查安装。

一旦完成上一步,接下来需要设置OpenCV环境变量并将其添加到系统路径以完成安装。下面将设置一个可创建OpenCV库的生成目录的环境变量。我们将会在项目中用到它。打开终端并输入以下命令:假设已有安装了64位的Visual Studio 2012。如果安装的是Visual Studio 2010,仅需要将前面的命令vc11替换为vc10。前面指定的路径是OpenCV二进制文件的存放地,而且lib和bin文件夹也在里面。如果使用的是Visual Studio 2015,你应该能够从头编译OpenCV。

接下来,将路径添加到系统的bin文件夹中。需要这样做的原因是因为将以动态链接库(DLL)形式使用OpenCV库。基本上,所有OpenCV算法都存储在这里。我们的操作系统在运行时才会加载它们。为了做到这一点,我们的操作系统需要知道它们所在的位置。系统环境变量将包含在哪能找到所有Dll文件的文件夹列表。所以,自然地,我们需要将OpenCV库的路径添加到这个列表中。我们为什么要做这一切呢?另一种选择是将所需的DLL复制到与应用程序的可执行文件(.exe文件)相同的文件夹中。这是不必要的开销,尤其是当我们正在进行许多不同的项目。

我们需要编辑环境变量,以便将它添加到这个文件夹。你可以使用如Path Editor等软件做到这一点。你可以从https://patheditor2.codeplex.com下载它。一旦你安装它,启动它,并添加以下新条目(你可以通过右键单击来插入一条新的项目的路径):

往前走,将它保存到注册表。就完成了!1.4.2 Mac OS X

在本节中,即将看到如何在Mac OS X上安装OpenCV。预编译文件不可用于Mac OS X,所以我们需要从头编译OpenCV。在我们开始之前,需要安装CMake。如果你没有安装CMake,你可以从https://cmake.org/files/v3.3/cmake-3.3.2-Darwin-x86_64.dmg下载。它是Dmg文件!所以,一旦你下载它,只要运行安装程序即可完成安装。

从opencv.org网站下载最新版本的OpenCV。当前版本是3.0.0,你可以从https://github.com/Itseez/opencv/archive/3.0.0.zip下载它。

解压缩到你所选择的文件夹。OpenCV 3.0.0还有一个叫作opencv_contrib的新包,其中包含尚未稳定的用户贡献。要时刻牢记的一件事是在opencv_contrib中的一些算法不能免费供商业使用。此外,安装这个软件包是可选的。如果你不安装opencv_contrib,OpenCV工作良好。如果我们正在安装OpenCV,正好可以安装这个包,这样,你稍后可以尝试使用它(而不是再一次经历整个安装过程)。这个包是一个学习和把玩新算法的绝佳方式。你可以从https://github.com/Itseez/opencv_contrib/archive/3.0.0.zip下载它。

将ZIP文件的内容解压缩到你所选择的文件夹。为方便起见,如前所述,将其解压缩到同一文件夹中,opencv-3.0.0和opencv_contrib-3.0.0在相同的主文件夹中。

现在我们已经准备好构建OpenCV。打开你的终端并跳转到解压缩的OpenCV 3.0.0的文件夹。在替换命令中的正确路径后运行以下命令:

需要时间来安装OpenCV 3.0.0。跳转到/full/path/to/opencv-3.0.0/build目录中,并且在终端上运行以下命令:

在前面的命令中,-j4标记表示它使用四个内核安装它。这种方式是更快!现在,让我们设置库路径。在你的终端运行vi~/.profile命令,打开你的~/.profile文件并添加以下代码:

我们需要将pkg-config中的opencv.pc文件复制到/usr/local/lib/pkgconfig,并将其命名为opencv3.pc。如果存在OpenCV 2.4.x安装程序,也不会造成冲突。让我们继续:

同时,我们需要更新PKG_CONFIG_PATH变量。打开你的~/.profile文件,并添加以下行:

使用以下命令重新加载你的~/.profile文件:

这样就完成了!接下来看看它是否正常工作:

如果看到Welcome to OpenCV 3.0.0显示在你的终端上,说明OpenCV正常工作。接下来将使用CMake生成涵盖整本书的OpenCV项目。我们将在下一章更详细地介绍。1.4.3 Linux

接下来看看如何在Ubuntu上安装OpenCV。在开始之前,需要安装一些依存关系。通过在终端上运行以下命令使用软件包管理器来安装它们:

现在,已安装依赖关系。接下来,下载、构建并安装OpenCV:

将pkg-config文件中的opencv.pc复制到/usr/local/lib/pkgconfig,并命名为opencv3.pc:

这样就完成了!现在就可以通过命令行编译我们的OpenCV程序。此外,如果已经存在OpenCV 2.4.x安装程序,并不会造成冲突。接下来检查安装程序是否工作正常:

如果看到Welcome to OpenCV 3.0.0显示在你的终端上,说明OpenCV正常工作。在下面的章节中,你将学习如何使用CMake来生成OpenCV项目。1.5 总结

在本章中,我们学会了如何在各种操作系统中安装OpenCV。讨论了人类的视觉系统和人类如何处理可视化数据。还知道为什么计算机做同样事情比较困难,以及设计一个计算机视觉库时需要考虑什么。接下来学到了OpenCV可以做什么和可以被用来做这些任务的各种模块。

在下一章中,即将讨论如何处理图像和如何使用各种模块处理它们。还将学习如何为OpenCV应用程序构建一个项目。第2章OpenCV基础知识介绍

在上一章中,我们学习了如何在各种操作系统环境下安装OpenCV,接下来将介绍OpenCV开发的基础知识。

本章中,你将学到如何使用CMake创建项目。

同时本章也会介绍项目工程中所需要的图像基本数据结构、矩阵,以及项目中常见的其他结构。

最后还会学习如何通过XML/YAML持久化的OpenCV函数在文件中存储变量和数据。

在本章,将学习如下主题:

·使用CMake配置项目工程

·从磁盘上读写文件

·通过摄像机读取视频数据

·主要图像结构(矩阵)

·其他重要和基本结构(向量、标量等)

·基础矩阵操作介绍

·OpenCV API中XML/YAML持久化的文件存储操作2.1 CMake基本配置文件

我们需要通过使用CMake来配置和检查项目工程所有依赖关系,但是这不是强制性的,还可以通过使用例如Makefiles或者Visual Studio等工具或IDE来配置项目工程。但是,CMake是配置多平台C++项目工程最方便的方式。

CMake使用一个叫作CMakeLists.txt的配置文件,在其中编译和依赖关系已经定义好了。对于一个基本程序来说,基于源代码文件的执行编译,一个两行的CMakeLists.txt文件是必要的。文件内容大体如下:

第一行定义了需要的CMake文件的最低版本。这行在CMakeList.txt文件中是强制性要写的,并且允许从在第二行定义的一个已知版本使用cmake功能。它定义了项目工程名称。这个名称被保存在PROJECT_NAME变量中。

最后一行在main.cpp文件中创建了一个执行命令(add_executable()),给它和项目一样的名称(${PROJECT_NAME}),并且将源代码编译进CMakeTest可执行文件。在这个可执行文件中设置了和项目一样的名称。

${}表达式允许进入环境,并定义任意变量。然后,可以使用${PROJECT_NAME}变量作为一个可执行输出名。2.2 创建库

CMake允许创建那些必须被OpenCV编译系统使用的库。在软件开发过程中,在多个应用中分解共享代码是常见并且有用的实践。在大型应用或者在多个应用中共享通用代码,这个实践是非常有用的。

在这个例子中,并没有创建一个二进制执行文件,取而代之的是,创建包含了所有函数、类等可编译文件,来用于开发。我们可以共享这个库给其他应用而不用开放源代码。

CMake中的add_library函数可以实现这个目的:

上述代码中的注释用#开头,注释会被CMake忽略。

add_library(Hello hello.cpp hello.h)命令定义了新库Hello,其中包含了如下源代码hello.cpp,hello.h。添加头文件是允许IDE(例如Visual Studio)去链接头文件。

依据操作系统是动态库还是静态库,这行将生成一个共享文件(OS X和Unix中是.so,Windows中是.dll)或者一个静态库(OS X和Unix中是.a,Windows中是.dll)。

target_link_libraries(executable Hello)是一个可以将可执行文件链接到需要的库的功能。在上述例子中,它是Hello库。2.3 管理依赖关系

CMake有搜索依赖关系和外部库的能力,这给创建依赖项目工程中的外部组件和添加复杂需求带来便利。

当然,在本书中最重要的依赖是OpenCV,我们将它添加到所有的项目工程中去:

接下来分析下脚本的工作原理:

第一行定义了CMake的最低版本;第二行告诉CMake使用新行为,以便它可以正确识别数字和布尔值常数而无须使用名称解引用变量。CMake2.8.0版本介绍了这项政策,在3.0.2版本中不设置CMake警告。最后一行定义了项目工程的标题:

这是搜索OpenCV依赖项的地方。FIND_PACKAGE是允许发现依赖项,并根据是必选还是可选得到的最低版本要求的函数。在这个脚本示例中,需要OpenCV 3.0.0版本或更高版本,而且它是一个必选的软件包。FIND_PACKAGE命令包括OpenCV的所有子模块,但是可以指定想要包括在其中使应用程序更小、更快的子模块。例如,如果想要仅使用基本OpenCV类型和核心功能,可以使用下面的命令行:

如果CMake发现不了它,它会返回一个错误,但不妨碍编译应用程序。

MESSAGE函数在终端或CMake GUI上显示一条消息。在本例中,我们将显示OpenCV版本,具体如下:

${OpenCV_VERSION}是一个CMake存储OpenCV包版本的变

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载