Blogger Information
Blog 143
fans 1
comment 0
visits 440513
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
opencv-创建OpenCV项目过程详解
弘德誉曦的博客
Original
1399 people have browsed it

本教程中,我们假定 C++ 是图像处理应用编程的主要语言,尽管实际上也提供了其他编程语言的接口和封装器(例如,PythonJava、MATLAB/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***t 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/

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post