创建OpenCV项目过程详解

本教程中,我们假定 C++ 是图像处理应用编程的主要语言,尽管实际上也提供了其他编程语言的接口和封装器(例如,PythonJavaMATLAB/Octave 等)。

本节说明如何用 OpenCV 的 C++API(一种易用的跨平台框架)开发应用。

库的一般使用方法

为了用 C++ 开发一个 OpenCV 应用,需要在代码中:
  1. 包含 OpenCV 的头文件定义;
  2. 链接 OpenCV 库(二进制文件),以获取最终的可执行文件;

OpenCV 头文件位于 OPENCV_BUILD\install\include\opencv2 目录中,此处对于每个模块都有一个文件(*.hpp)。用 #include 指令包含头文件,如下所示:

//在代码中包含所使用的每个模块的头文件
#include <opencv2/<module_name>/<module_name>.hpp>

用这个指令,可以包含用户程序所需的每个头文件。另一方面,如果包含 opencv.hpp 头文件,那么所有的头文件都将被自动包含,如下所示:

//在代码中包含所有的Opencv头文件
#include <opencv2/opencv.hpp>

注意,本地安装的所有模块都在 OPENCV_BUILD\install\include\opencv2\opencv_modules.hpp 头文件中定义,并在 OpenCV 的构建过程中自动生成。

#include 指令的使用并非总能保证对头文件的正确包含,因为告诉编译器在哪里能找到包含文件是有必要的。这一点可以通过传递具有文件位置的一个特殊参数来实现(例如,对于 GNU 编译器为 I\<location>)。

链接过程需要提供(动态或静态)链接库,在这里可以找到所需的 OpenCV 功能。这个过程通常用链接器的两种类型参数完成:库的位置(例如,GNU 编译器的 -L\<location>)和库的名字(例如,-l<module_name>)。

https://gcc.gnu.org/onlinedocs/https://www.gnu.org/software/make/manual/ 下,可以找到对于 GNU GCC 和 Make 可用的在线文档的一个完整列表。

开发新项目的工具

开发我们自己的 OpenCV C++ 应用的主要先决条件是:
  • OpenCV 头文件和库二进制文件:当然,我们需要编译 OpenCV,并且对这样一个编译,辅助库是先决条件。该代码包应该使用与生成用户应用程序相同的编译器来编译。
  • 一个 C++ 编译器:一些关联工具用作代码编辑器、调试器、项目管理器、构建过程管理器(例如,CMake)、修订控制系统(例如,Git、Mercurial、SVN 等)、类检测器等是方便的。通常,这些工具在一个集成开发环境(IDE)中一起进行配置。
  • 任何其他辅助库:有时编写最终应用程序所需的任何其他辅助库,例如绘图、统计等,可能是需要的。

对于编写 OpenCV C++ 应用,最流行的可用编译工具包是:
  • Microsoft Visual C(MSVC):只在 Windows 上支持,与 IDE Visual Studio 集成得很好,当然也可以与其他跨平台的 IDE 集成,例如,Qt 生成器或 Eclipse。与目前最新的 OpenCV 发布兼容的 MSVC 版本是 VC 10、VC 11 和 VC 12(Visual Studio 2010、2012 和 2013)。
  • GNU Compiler Collection GNU GCC:这是由 GNU 项目开发的一个跨平台的编译器系统。对于 Windows 来说,该工具包就是众所周知的 MinGW(最小的 GNU GCC)。与目前 OpenCV 发布兼容的版本是 GNU GCC 4.8。该工具包可以和若干 IDE 一起使用,例如,Qt 生成器、Code::Blocks、Eclipse 等。

对于本书提供的示例,我们为 Windows+Qt 5.2.1 库和 Qt 生成器 IDE(3.0.1)使用 MinGW 4.8 编译工具包。编译 OpenCV 需要跨平台 Qt 库所提供的新 UI 功能。

注意,对于 Windows,可以从 http://qt-project.org/ 下载一个 Qt 包(包括 Qt 库、Qt 生成器和 MinGW 工具包)。这个包大约 700MB。

Qt 生成器是一个针对 C++ 的跨平台 IDE,它集成了我们编写应用时所需的工具。在 Windows 中,可以使用 MinGW 或 MSVC。图 1 展示了对于一个 OpenCV C++ 项目具有不同的面板和视图的 Qt 生成器的主窗口。

某 OpenCV C++ 项目中具有视图的 QT 生成器的主窗口
图 1 某 OpenCV C++ 项目中具有视图的 QT 生成器的主窗口

使用 Qt 生成器创建 OpenCV C++ 程序

接下来,我们说明如何用 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):
TARGET: showImage
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
    showImage.cpp
INCLUDEPATH += C:/opencv300-buildQt/install/include
LIBS += -LC:/opencv300-buildQt/install/x64/mingw/lib \
    -lopencv_core300.dll \
    -lopencv_imgcodecs300.dll\
    -lopencv_highgui300.dll\
    -lopencv_imgproc300.dll
上面的文件说明 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/