【Opencv】VS2019 Opencv3.4.9扩展库的配置

VS2019 Opencv3扩展库的配置

本文以VS2019+OpenCV3.4.9+Opencv Contrib 3.4.9为例,进行Opencv扩展模块的配置,并且记录其中出现的过程,希望可以给其他人提供参考

1. 工具准备

2. 下载扩展库

因为Opencv官方提供的代码库放在github上,因为服务器在国外,下载速度非常慢,比如50M左右的扩展库下载需要一个小时,并且经常下载失败,这里提供两种解决方案,可以到码云(gitee)进行下载。

2.1 直接搜索法

比如下载Opencv Contrib可以到https://gitee.com/mirrors/opencv_contrib?_from=gitee_search进行下载。

2.2 克隆到码云法

把github上的库fork到自己的仓库下面,使用gitee与github直接相互导入的功能,把github的库可以clone到gitee上,然后再下载会快很多,可以看附带的参考资料[1]

3. 编译源代码

编译源代码使用Opencv3.4.9、Opencv Contrib 3.4.9和Cmake进行

3.1 创建文件夹

首先在文件目录中创建三个文件夹,其中opencv是下载的源代码,opencv_contrib是下载的扩展库,NewOpencv是重新编译以后产生的代码
在这里插入图片描述

3.2 使用Cmake进行第一次编译

第一次编译只使用Opencv的源代码进行,在source code里面选择Opencv3.4.9的源代码所在位置,即source文件目录,binaries里面选择要把源代码编译到哪个文件目录,这里选择的是NewOpencv

第一次编译的时候,会选择使用的编译器,因为我使用的是VS2019,所以选择的就是Visual Studio 16 2019这个选项。点击finish后,开始第一次编译,大概需要等待几分钟时间,即可完成第一次编译

3.3 对第一次编译结果进行配置

第一次编译结束之后,Cmake界面会出现很多红色的东西,这个时候我们进行额外库的添加、nonfree库的使用、库文件打包输出三个操作。

  • Contrib库的添加
    在search里面搜索 OPENCV_EXTRA_MODULES_PATH,找到添加额外模块库,把opencv_contrib库的modules路径添加进来
    在这里插入图片描述
    这里需要注意一点,Cmake里面文件格式路径是左斜线/,windows系统的文件目录是右斜线\,如果直接复制windows的文件目录,要把斜线方向修改一下,否则会出现Error in configuration progress这个错误
    在这里插入图片描述
  • nonfree库的使用
    因为nonfree是Opencv的一个专利库,要使用的话,要在CMake里面设置使能

在这里插入图片描述

  • 库文件打包输出的设置
    因为Opencv的各个库模块特别多,我们可以通过设定选项,让所有模块打包起来,最后只生成一个lib库文件,方便后面我们配置项目文件。在BUILD_opencv_world这个选项后面打钩即可。
    在这里插入图片描述

3.4 第二次编译

3.4.1Cmake错误提示

完成上面三步配置之后,即可点击configure选项,进行第二次的配置。
第二次配置的时候,Cmake中会有一些脚本语句,在线下载一些依赖库文件,比如ffmpeg,ippicv,boostdesc和vgg等。但是很有可能会出现不能下载,系统报错的问题。这时候我们就需要自己下载这些文件。那么我们应该从哪里下载这些文件,又应该把这些文件复制到什么地方呢?这需要我们来看Cake的错误提示

在这里插入图片描述

这个时候CMake提示我们,打开CMakeDownloadLog.txt文件夹,查看详细错误内容

3.4.2查看CMakeDownloadLog.txt文件

我们打开CMakeDownloadLog.txt文件夹,查看里面的错误说明,会看到这样类似的语句:

3.4.3 脚本运行错误含义

这些语句的含义为:

(1)使用D:/opencv/opencv/sources/.cache中的文件夹作为缓冲区
(2)从网站
https://raw.githubusercontent.com/opencv/opencv_3rdparty/548e3c997a80d65f710b9048f1d33371e3a203ac/ffmpeg/opencv_ffmpeg.dll下载ffmpeg/opencv_ffmpeg.dll文件
(3)该文件的MD5值(相当于文件的ID)为168635a192fc2d2ae7d7d40150f0b349
(4)最后把下载到的文件复制到D:/opencv/NewOpencv/3rdparty/ffmpeg
(5)然后最后结果为下载失败。

因为是下载失败的,所以相应的.chche路径下虽然会产生这个文件,但是文件大小都是0KB。
在这里插入图片描述

3.4.4 手动解决方案

知道了这些脚本的含义之后,我们就可以进行手动解决了。我们到文件中写的网站去下载opencv_ffmpeg.dll等文件

这里以下载ffmpeg_version.cmake为例进行介绍。

  1. 复制CMakeDownloadLog.txt中提到的错误位置,打开网页或者文件
  1. 右键另存为把该文件保存到自己电脑
    注意一定不要直接复制网页内容,自己创建文件夹,这样产生的文件,虽然名字是一样的,但是MD5值不同,可能会出现因为MD5值不匹配,依旧不能使用的问题

  2. 往相应的.cache目录下进行复制,文件的名称为MD5值+原来名字
    这个名字可以直接从CMakeDownloadLog.txt错误提示中找。
    在这里插入图片描述
    像这样把修改名字之后的文件复制进.cache文件夹的相应文件目录下面
    在这里插入图片描述

  3. 往NewOpencv相应目录复制
    手动把文件复制NewOpencv相应的文件夹里面去。这里的文件名不需要加MD5值

  1. 完成所有丢失文件的下载复制之后,点击CMake的configure,就不会再有错误出现了。

3.4.5 完成第二次编译

3. 5 生成解决方案

点击CMake界面的generate即可生成带有扩增库的Opnecv编译项目文件。最后点击Open project打开解决方案,继续生成Opencv及其扩增库的头文件、库文件、动态链接库文件。

3.6生成需要的库文件

在VS project的界面中,菜单栏选择生成-》批生成
在批生成界面找到INSTALL,选择Debug x64,然后点击生成。如果是32位的就修改为x86。
在这里插入图片描述
生成install文件的过程比较久。当生成结束之后,在NewOpencv就可以找到相应的install文件夹了,里面放置着opencv及其扩展库的头文件、库文件和动态链接库文件,install文件夹内包含以下内容:
在这里插入图片描述

4. 配置生成的工程文件

4.1 新建工程文件

新建一个VS2019的空文件即可

4.2 添加path路径

我的电脑->属性->高级系统配置->环境变量->Path中添加动态链接库所在的路径,动态链接库所在的路径为在install->x64->vc16->bin
如:D:\opencv\NewOpencv\install\x64\vc16\bin

在这里插入图片描述

4.3 添加头文件和库文件的路径

头文件路径D:\opencv\NewOpencv\install\include
库文件加路径为D:\opencv\NewOpencv\install\x64\vc16\lib

4.4添加附加依赖库

链接器->输入->附加依赖项中加入lib目录下所包括的库文件。因为我们在前面CMake中选择了打包编译,所以最后只添加一个lib即可,即opencv_world349d.lib。

库文件中应该还有另外一个lib,对Opencv扩展库运行好像不是必须的,但是我也把他加入进来了。

在这里插入图片描述

4.5 将dll文件复制到windows系统库中

install->x64->vc16->bin 中的opencv_world349d.dll复制到windows相应的运行库系统中。

32位系统复制到:C:\Windows\System32
64位系统复制到:C:\Windows\SysWOW64

到此就完成了Opencv及其附加库的编译以及配置过程

4.6 期间遇到的一个小问题

在配置完了所以的库之后,写了一些扩展库的代码进行运行,但是系统一直报错,报错名称为无法定位程序输入点~于动态链接库上

类似于这个样子:
在这里插入图片描述
这个原因是系统无法找到匹配的opencv_world349d.dll的位置,一般来说把PATH路径配置好,并且把opencv_world349d.dll文件复制到了SysWOW64文件夹之后,是不应该还有这个问题的。

更加神奇的是,如果把NewOpencv中的这个文件夹,复制到和自己的程序的exe文件在相同路径下,程序就能正常的运行扩展库了。

参考资料[6]中提出了该问题的解决思路,原来,系统搜索dll文件是按照这个顺序搜索的:

A 可执行文件所在目录;
B 进程当前目录;
C 系统目录,%SystemRoot%/system32
D 16位系统目录;,%SystemRoot%/system
E Windows目录,%SystemRoot%/
F 环境变量PATH中的目录;

所以,这个问题的产生是由于,之前没有安装Opencv扩展库的时候,往system32路径下复制了一个opencv_world349d.dll文件,这个动态链接库是不包含扩展库的,而我写的程序调用opencv_world349d.dll的时候,按照上面写的顺序,没有读取64位系统和Path路径中的dll文件,而是读取了32位系统中的dll文件,所以就会出现dll文件不匹配的问题。当把system32中的opencv_world349d.dll删除了之后,程序就能正常运行了。

5.运行测试代码

这里的运行代码以SURF特征检测为例进行测试

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/xfeatures2d/nonfree.hpp>
#include<opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat m = imread("1.jpg");
	Mat n = imread("3.jpg");
	imshow("m", m);
	imshow("n", n);
	int minHessian = 400;
	
	

	Ptr<Feature2D>detector = xfeatures2d::SURF::create(minHessian);

	std::vector<KeyPoint> keyPoint1, keyPoint2;

	detector->detect(m, keyPoint1);
	detector->detect(n, keyPoint2);

	Mat mp1, np2;
	drawKeypoints(m, keyPoint1, mp1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	drawKeypoints(n, keyPoint2, np2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);

	imshow("m1", mp1);
	imshow("n1", np2);


	waitKey(0);



	return 0;
}


运行结果如下:
在这里插入图片描述

参考资料

[1]完美解决Github上下载项目失败或速度太慢的问题
[2] vs2019+opencv3.4.6+contrib3.4.6源码编译
[3] VS2017+OpenCV 3.x+SURF算子使用
[4] CMake opencv时Download: opencv_ffmpeg.dll、ippicv等失败的解决方法
[5] Cmake error: Invalid escape sequence \U
[6] 【问题解决】无法定位程序输入点~于动态链接库上(The procedure entry point ~ could not be located)
[7]opencv3中surfDetector中使用
[8] opencv3.4.0中使用SURF算子

发布了14 篇原创文章 · 获赞 1 · 访问量 493

猜你喜欢

转载自blog.csdn.net/qq_41741344/article/details/104836276