欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Win10+vs2019+OpenCV4.1.2的配置

程序员文章站 2022-05-23 13:25:41
...

OpenCV4.1.2在win10系统及vs2019下的配置

1·简介

本文介绍如何在win10下使用visual studio 2019以及cmake3.16.1进行OpenCV4.1.2+OpenCV_contrib的配置,以及配置过程中常见的问题。
OpenCV是一个开源的跨平台计算机视觉库,官方网址:https://opencv.org/

2·下载及编译

目前OpenCV在win10下的安装,可以使用官方提供的.exe文件直接安装,或从源码开始自己编译。源码编译的好处是我们能够将未集成到正式release版本中的、OpenCV_contrib内容加入。我们从github上下载OpenCV以及对应的contrib部分,注意版本号要一致,这里采用的是4.1.2,下载后解压。
首先使用cmake进行编译,这里cmake版本是3.16.1,主要是因为visual studio是2019版本,低版本的cmake没有对应的generator选项。
首先选择源码位置与生成位置,源码位置是opencv解压后的文件夹,生成位置可以自定义
Win10+vs2019+OpenCV4.1.2的配置
指定generator为Visual Studio 16 2019
Win10+vs2019+OpenCV4.1.2的配置
点击configure。这一过程中,会下载一些包或组件,初次configure可能时间较长,耐心等待即可。
下载过程中,下载到的包会存放在.cache目录下,由于下载可能断开并且不支持断点续传,很可能没有下载完成就断开,然后直接进入到后续的校验环节,此时一定会校验出错,导致这一组件下载失败。解决方法是,可以手动下载这些组件放到.cache目录对应位置,按照相应的方式命名即可。
可以观察下载过程的log文件:也就是build生成目录下的 CMakeDownloadLog.txt
第一行就是: #use_cache “D:/ProgramFile/opencv/opencv-4.1.2/.cache”
这里就是下载的组件存放位置,configure过程也会首先查看这里有没有已下载好的,并进行校验。
下载失败的,会在log里显示下载的url,如果不知道缺失的在哪里下载,可直接复制相应链接自行下载。
首次configure后,将OPENCV_EXTRA_PATH修改为opencv_contrib下的modules文件夹路径,再次configure。
结束后点击generate生成。
generate done后,cmake部分结束,接下来要用宇宙第一编译器-VS了。
打开vs2019,打开OpenCV.sln,分别先后生成ALL_BUILD和INSTALL,要注意如果debug和release的版本都需要,则要修改生成的平台选项分别生成。
生成成功后就可以在 build\install\x64\vc16\lib 目录下看到生成的库。注意在cmake的configure阶段,如果勾选了BUILD_opencv_world选项,则只会生成一个opencv_worldXXX.lib或opencv_worldXXXd.lib,否则会对每一个模块生成一个lib文件。集成的好处在于方便快捷,分开的好处是部署于嵌入式平台时只需要用到的库即可,节省空间,项目更轻量级。这里XXX是版本号,版本号后面包含d的debug版本,否则是release版本。
将build\install\x64\vc16\bin加入到环境变量中。要注意配置完环境变量后最好重启一下VS避免后续出错。
接下来是对vs项目进行opencv的配置。

3·VS配置

首先新建一个空的项目。这里的配置方式有两种:
一是通过属性管理器,直接修改Microsoft.Cpp.x64.user.props
这会使得今后创建的所有C++项目,均带有opencv的配置。好处是以后不需要单独设置,但缺点在于,如果你写了一个不需要opencv的项目并将工程文件分享给了其他人,对方没有配置opencv,那对方执行时就会出错。
所修改的配置表位于Debug和Release下的Microsoft.Cpp.x64.user
Win10+vs2019+OpenCV4.1.2的配置
二是对该解决方案单独配置。
好处是新建的项目不包含opencv配置,如果该项目与opencv无关,则将工程文件分享给他人后,别人也能正常运行。坏处是需要opencv的项目每次都要配置一次。

配置细节:
在VC++目录 - 包含目录下增加opencv/build/install/include及其子目录,opencv4.0后这一目录下不再有opencv而只有opencv2了;
Win10+vs2019+OpenCV4.1.2的配置
在VC++目录 - 库目录下,添加 opencv/build/install/x64/vc16/libWin10+vs2019+OpenCV4.1.2的配置
在 链接器 - 常规下 - 附加库目录下 添加 opencv/build/install/x64/vc16/libWin10+vs2019+OpenCV4.1.2的配置
在链接器 - 输入 - 附加依赖项添加对应的opencv_worldXXX(d).lib,XXX为版本号,加(d)与否取决于debug或release。
Win10+vs2019+OpenCV4.1.2的配置
至此配置完毕。

4·VS2019的“坑”

另外,在使用VS2019时,我发现其属性管理器中的Microsoft.Cpp.x64.user.props表在debug和release模式下,其实是同一张表,也就是说,只凭这里的修改,我无法使debug和release同时可用。原因是,debug下,应该设置附加依赖项为opencv_worldXXXd.lib,由于用的是相同配置,此时release也设置为了这个值,导致直接切换到release版本会报错(类似于opencv_world412.dll未找到),反之亦然。这一点在我之前使用的VS2015是没有出现的。
目前解决方案是直接修改Microsoft.Cpp.x64.user.props这张表
按照配置文件路径,找到了这里:
Win10+vs2019+OpenCV4.1.2的配置
果然只有独一份。
没办法只好修改这一配置,vscode中打开并修改如下:
Win10+vs2019+OpenCV4.1.2的配置
原本这里只有一份的设置,这里增加不同的Condition对Debug和Release分别配置。(早知道直接改这张表就好了,何必在VS里找来找去)这里的AdditionalLibraryDirectories就是附加库目录,AdditionalDependencies是附加依赖项,其实只有附加依赖项需要在Debug和Release下加以区分。
我这种方法有点暴力,大家有更温和的方式也欢迎分享一下。
总之这里修改好之后,opencv配置就完成了,可以跑一个例程试试看。
例如:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main() {
	Mat image = imread("your path to image");
	if (image.empty()) // Check for invalid input
	{
		cout << "Could not open or find the image" << std::endl;
		return -1;
	}


	namedWindow("Display", WINDOW_AUTOSIZE); // Create a window for display.
	imshow("Display", image); // Show our image inside it.

	waitKey(0); // Wait for a keystroke in the window
	return 0;
}