本教程中,我们假定 C++ 是图像处理应用编程的主要语言,尽管实际上也提供了其他编程语言的接口和封装器(例如,Python、Java、MATLAB/Octave 等)。
本节说明如何用 OpenCV 的 C++API(一种易用的跨平台框架)开发应用。
为了用 C++ 开发一个 OpenCV 应用,需要在代码中:
OpenCV 头文件位于 OPENCV_BUILD/install/include/opencv2 目录中,此处对于每个模块都有一个文件(*.hpp)。
用 #include 指令包含头文件,如下所示:
用这个指令,可以包含用户程序所需的每个头文件。另一方面,如果包含 opencv.hpp 头文件,那么所有的头文件都将被自动包含,如下所示:
注意,本地安装的所有模块都在 OPENCV_BUILD/install/include/opencv2/opencv_modules.hpp 头文件中定义,并在 OpenCV 的构建过程中自动生成。
#include 指令的使用并非总能保证对头文件的正确包含,因为告诉编译器在哪里能找到包含文件是有必要的。这一点可以通过传递具有文件位置的一个特殊参数来实现(例如,对于 GNU 编译器为 I/<location>)。
链接过程需要提供(动态或静态)链接库,在这里可以找到所需的 OpenCV 功能。这个过程通常用链接器的两种类型参数完成:库的位置(例如,GNU 编译器的 -L/<location>)和库的名字(例如,-l<module_name>)。
开发我们自己的 OpenCV C++ 应用的主要先决条件是:
对于编写 OpenCV C++ 应用,最流行的可用编译工具包是:
对于本书提供的示例,我们为 Windows+Qt 5.2.1 库和 Qt 生成器 IDE(3.0.1)使用 MinGW 4.8 编译工具包。编译 OpenCV 需要跨平台 Qt 库所提供的新 UI 功能。
Qt 生成器是一个针对 C++ 的跨平台 IDE,它集成了我们编写应用时所需的工具。在 Windows 中,可以使用 MinGW 或 MSVC。图 1 展示了对于一个 OpenCV C++ 项目具有不同的面板和视图的 Qt 生成器的主窗口。
接下来,我们说明如何用 Qt 生成器的 IDE 创建代码项目。特别地,我们将这个描述应用到一个 OpenCV 示例上。
使用 Qt 生成器,可以为任意 OpenCV 应用程序创建项目。要做到这一点,需要导航到 File|New File or File|Project,然后导航到 Non-Qt Project|Plain C++Project。之后,必须选择一个项目名字和将要存储的位置。
再下一步,为该项目(在该示例中,台式机为 Qt 5.2.1MinGW 32位)选择一个工具包(即编译器),并为生成的二进制文件定位。通常,使用两种可能的方法构建配置(配置文件):debug 和 release。这些配置文件设置合适的标志(flag)来构建和运行二进制文件。
使用 Qt 生成器创建一个项目时,生成两个特殊文件(具有 .pro 和 .pro.user 扩展名)来配置构建和运行过程。该构建过程是通过项目创建期间所选择的工具包确定的。对于 Qt 5.2.1MinGW 32 位包,这个过程则依赖于 qmake 和 mingw32-make 工具。使用 *.pro 文件作为输入,qmake 会为驱动每个配置文件(即 release 和 debug)的构建过程,产生该生成文件。在 Qt 生成器 IDE 使用 qmake 工具替代 CMake,可简化软件项目的构建过程。只需几行信息,即可自动产生生成文件。
以下代码行表示一个 *.pro 文件的示例(例如,showImage.pro):
上面的文件说明 qmake 所需的选项,以便为项目构建二进制代码产生合适的生成文件。以一个标签开始的每一行,指定一个选项(TARGET、CONFIG、SOURCES、INCLUDEPATH 和 LIBS),后跟一个标志来添加(+=)或删除(-=)该选项的值。在这个示例项目中,使用非 Qt 控制台应用。
可执行文件是 showImage.exe(TARGET)和源文件 showImage.cpp(SOURCES)。因为这个项目是一个基于 OpenCV 的应用,所以后两个标签指定头文件的位置(INCLUDEPATH)以及由这个特定项目(core、imgcodecs、highgui和imgproc)所使用的 OpenCV 库(LIBS)。
有关 Qt 项目开发中用到的工具(包括 Qt 生成器和 qmake)的详细描述,可访问 http://doc.qt.io/。