学习OpenCV4:OpenCV各模块介绍 Windows上进行C++开发,常用的IDE(集成开发工具)为Visual Studio,该软件由微软发布,最新版本为Visual Studio 2019(Visual Studio 2022正式版待发布)。本案例基于Visual Studio 2019开发,Visual Studio 2019的安装方法如下。

安装前读者需要去官网(https://visualstudio.microsoft.com/zh-hans/vs/)下载安装文件,对于个人开发者,可以选择下载社区版Community 2019,如图1.6所示。

learning opencv4_#include

图1.6

Community 2019下载的文件名称为vs_Community.exe,双击该文件进行安装,安装过程中读者可以选择下载安装工作负载(即不同开发环境)与单个组件,如图1.7所示。

learning opencv4_计算机视觉_02

图1.7

Visual Studio 2019支持C++桌面开发,Python开发,Node.js开发等,读者可以选择自己需要的环境进行安装,本案例需要C++桌面开发,勾选安装即可,安装完成重启即完成了Visual Studio 2019的安装。

OpenCV常用的两种开发语言是C++和Python,本节讲解在Windows下搭建OpenCV C++语言开发环境,环境搭建方法有两种:安装官方发布的库文件和源码编译。

第一种方法:库文件安装

使用库文件安装的方法进行环境搭建过程如下:

首先下载库文件,如图1.8所示,进入官网选择Library->Releases,进入Release库文件包下载页面。

learning opencv4_windows_03

图1.8

在图1.8中选择Windows系统的文件下载,点击选择之后会自动开始下载。

本案例选择OpenCV-4.5.2版本,下载的文件名为opencv-4.5.2-vc14_vc15.exe,双击该文件解压,如图1.9所示。

learning opencv4_learning opencv4_04

图1.9

也可以右键选择文件,“解压到当前文件夹”,会在当前路径下解压得到文件夹opencv,其中包含两个子文件夹:

– build,存放编译的二进制库文件;

– sources,存放当前版本的源码。

进入build文件夹,路径下有六个文件夹:

– bin,存放第三方库依赖文件;

– etc,存放资源文件;

– include,存放头文件;

– java,存放Windows系统Java库文件;

– python,存放Windows系统Python语言安装文件;

– x64存放Windows C++库文件,包含vc14和vc15两个版本。

对于Visual Studio 2019,可以选用最新版本的vc15编译器对应的库文件,vc15路径下包含两个文件夹:bin(存放动态库文件)和lib(存放静态库文件),OpenCV工具库调用最重要的三个文件为:头文件(存放于include文件夹)、动态库(opencv_world452.dll或者opencv_world452d.dll)以及静态库(opencv_world452.lib或者opencv_world452d.lib)。

下载解压完成后,需要配置OpenCV开发环境,并编写测试代码进行测试。

选择打开Visual Studio 2019,创建新项目。创建项目可以直接选择创建“控制台应用”,创建的项目中有主程序,并默认输出“Hello World”,如图1.10所示。

learning opencv4_learning opencv4_05

图1.10

配置新项目,设置项目名称和项目位置,解决方案名称可以使用默认的,和项目名称相同,如图1.11所示。

learning opencv4_windows_06

图1.11

在项目中需要配置OpenCV库引用才能使用OpenCV,环境配置需要配置三个方面内容:包含目录,库目录和链接器依赖项。包含目录与库目录的配置如图1.12所示。

learning opencv4_learning opencv4_07

图1.12

在“链接器-输入-附加依赖项”中配置附加依赖项,即静态库文件名称,如图1.13所示,配置时注意选择Debug或Release对应的静态库文件。

learning opencv4_#include_08

图1.13

选择“应用”和“确定”后即完成配置,然后编写测试代码测试OpenCV库的使用,本案例的测试方法为读取一张图像,并将图像显示出来。

// OpenCVdemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

 

#include <iostream>

#include "opencv2/opencv.hpp"

 

int main()

{

    cv::Mat img = cv::imread("src.jpg", 1);         //图像读取

    cv::imshow("测试图像显示", img);                //图像显示

    cv::waitKey(0);                                 //等待读者操作

    cv::destroyWindow("测试图像显示");              //窗口对象销毁

}

选择项目,点击右键“生成”,编译项目,编译完成结果如图1.14所示。

learning opencv4_计算机视觉_09

图1.14

编译没有出错,此时可以点击图1.14中的“本地Windows调试器”或者按下F5,运行项目。如果读者没有做额外的配置,此时运行项目会弹出图1.15所示的错误框。

learning opencv4_windows_10

图1.15

这个错误称为“运行时错误”,运行时错误的常见原因是动态库文件无法找到或者不匹配。这种问题的解决办法有如下两种:

n 第一种方法是将动态库路径配置到环境变量中。读者可以选择“计算机—>属性—>高级系统设置—>环境变量”,找到Path变量,将OpenCV文件包中的opencv/build/x64/vc15/bin路径配置到环境变量中,这样运行时就能找到动态库的路径。

n 第二种方法就是将动态库拷贝到生成的可执行文件所在路径中,如图1.16所示。

learning opencv4_opencv_11

图1.16

这两种办法是为了让可执行文件OpenCVdemo.exe能在搜索路径中找到OpenCV的动态库文件,当前路径和环境变量都是Windows系统中可执行文件链接时的搜索路径。

再次执行,程序正常运行,如图1.17所示,表明Windows系统中配置OpenCV C++语言开发环境完成。

learning opencv4_learning opencv4_12

图1.17

在C++语言开发时,需要包含"opencv2/opencv.hpp"头文件,该头文件对所有模块的头文件做了引用:

#ifndef OPENCV_ALL_HPP

#define OPENCV_ALL_HPP

 

// 该头文件仅用于定义哪些模块参与了编译,定义了HAVE_OPENCV_modulename的值

#include "opencv2/opencv_modules.hpp"

 

// Core模块为必需的模块

#include "opencv2/core.hpp"

 

// 通过HAVE_OPENCV_modulename检查可选模块的引入

#ifdef HAVE_OPENCV_CALIB3D

#include "opencv2/calib3d.hpp"

#endif

#ifdef HAVE_OPENCV_FEATURES2D

#include "opencv2/features2d.hpp"

#endif

#ifdef HAVE_OPENCV_DNN

#include "opencv2/dnn.hpp"

#endif

#ifdef HAVE_OPENCV_FLANN

#include "opencv2/flann.hpp"

#endif

#ifdef HAVE_OPENCV_HIGHGUI

#include "opencv2/highgui.hpp"

#endif

#ifdef HAVE_OPENCV_IMGCODECS

#include "opencv2/imgcodecs.hpp"

#endif

#ifdef HAVE_OPENCV_IMGPROC

#include "opencv2/imgproc.hpp"

#endif

#ifdef HAVE_OPENCV_ML

#include "opencv2/ml.hpp"

#endif

#ifdef HAVE_OPENCV_OBJDETECT

#include "opencv2/objdetect.hpp"

#endif

#ifdef HAVE_OPENCV_PHOTO

#include "opencv2/photo.hpp"

#endif

#ifdef HAVE_OPENCV_STITCHING

#include "opencv2/stitching.hpp"

#endif

#ifdef HAVE_OPENCV_VIDEO

#include "opencv2/video.hpp"

#endif

#ifdef HAVE_OPENCV_VIDEOIO

#include "opencv2/videoio.hpp"

#endif

 

#endif

如果读者对OpenCV结构比较熟悉,在使用时可以只包含对应的某个模块,如图像滤波功能调用可以只包含"opencv2/imgproc.hpp"头文件,在后续章节讲解每个模块时,都会讲解包含该模块对应的头文件,导读内容可以查看当前模块暴露的算法函数。