win10+vs2017+opencv3.4.3+cmake配置opencv contrib过程和注意事项

1.为什么要装opencv contrib

opencv只包含基本内容,如果需要用到surf特征提取等内容因为版权问题必须安装opencv_contrib

2.安装需要的文件获取

vs2017:https://visualstudio.microsoft.com/zh-hans/downloads/

opencv:https://opencv.org/releases.html

    我用的是opencv3.4.3版本,你可以选择自己喜欢的版本,但是要注意后期下载opencv_contirb时要选择对应的版本,否则可能失败

cmake:https://cmake.org/download/

    cmake有很多版本,一般建议选择下载绿色版或安装版,其他版本我没用过,不知道怎么用

opencv_contrib: https://github.com/opencv/opencv_contrib

    请一定选择和opencv一样的版本号,不然可能会出错。下载完成之后解压即可。

这一步基本就是这四个了。

3.安装vs2017,opencv_contrib和cmake

这一步很简单,vs2017直接安装就可以了,这是一个比较详细的安装和使用过程,有不懂的小伙伴可以参考一下

opencv下载之后是一个自解压程序,双击解压即可,需要选择一个合适的目录,为了保险最好是没有其他符号和中文的,我选择的目录是D:/document/Cpp,所以接下来的操作中我的opencv文件目录都是这个。

如果你下载的是安装版(msi)的cmake,则直接正常安装即可,要注意的是把他添加到系统环境中,不要选错了,因为默认是不添加的。

4.配置opencv_contrib

  1. 第一步到第五步的操作都是在Cmake中进行的。首先打开cmake,where is the source code 选择opencv文件夹中source的目录,我的是D:/document/Cpp/opencv/sources,你可以根据实际情况更改目录
  2. where to build the binaries 选择需要存放生成文件的目录,根据其他教程我选择的是D:/document/Cpp/opencv/new_bulid 这里要注意的是我们选择的目录最好还在opencv文件夹中,但不能是opencv文件夹中原有的目录,命名你开心就好,但最好是纯英文

    win10+vs2017+opencv3.4.3+cmake配置opencv contrib过程和注意事项

     

  3. 点击configure,第一次使用会弹出对话框,选择对应的vs版本即可,其他的不用管。我的是vs2017 64位,所以我选择的是vs2017 Win64,之后点确认,程序开始运行,运行完成后会在最下方显示configuration done.
  4. 在cmake搜索框中搜索OPENCV_EXTRA_MODULES_PATH,将其值选择为opencv_contrib文件夹中的modules文件夹,我的是D:\document\Cpp\opencv\opencv_contrib-3.4.3,你需要选择对应的文件夹。同时要保证WITH_CUDA未被勾选,我的默认是不勾选的。最后再一次点击configure,成功之后依然会在最下边显示configuration done.对了,这两次点击之后都要等比较长的时间

    win10+vs2017+opencv3.4.3+cmake配置opencv contrib过程和注意事项

    win10+vs2017+opencv3.4.3+cmake配置opencv contrib过程和注意事项

  5. 点击generate,这一次很快。然后直接在cmake面板点击open project打开项目。至此Cmake中的操作全部完成,可以关掉它了。
  6. 第六步之后的操作都是在vs2017中完成的。在第五步中已经打开了项目文件,因此接下来继续操作就好了。首先是选择64或32位的Debuge和Release,在菜单栏选择生成->生成解决方案,每次都需要十几分钟的等待,会提示生成的情况,我的是成功140个,有的可能会少,具体原因不是很清楚,但可以先往下进行。
  7. 之后右键CMakeTargets中的INSTAKLL,选择仅限于项目->仅生成INSTALL,等待一小会就好了。
  8. 接下来是系统环境配置,这一步引用自添加OpenCV_contrib库至OpenCV3.1.0中(Windows 64位 环境下编译OpenCV3.1.0和OpenCV_contrib)的配置环境变量部分,为了文章完整性我将这些内容粘贴了过来
  9. 1、重新配置环境变量

    ①、环境变量设置:

    变量名:OPENCV
    变量值:*\opencv\new_build\install
    注:*表示安装目录

    ②、用户变量配置:

    *\opencv\new_build\install\x64\vc14\bin
    注:*表示安装目录

    2、重新配置项目环境

    ①、包含目录:

    *\opencv\new_build\install\include
    *\opencv\new_build\install\include\opencv
    *\opencv\new_build\install\include\opencv2
    注:*表示安装目录

    ②、库目录:

    *\opencv\new_build\install\x64\vc14\lib
    *\opencv\new_build\install\x64\vc14\staticlib
    注:*表示安装目录

    ③、附加依赖项:

    opencv_aruco310d.lib
    opencv_bgsegm310d.lib
    opencv_calib3d310d.lib
    opencv_ccalib310d.lib
    opencv_core310d.lib
    opencv_datasets310d.lib
    opencv_dnn310d.lib
    opencv_dpm310d.lib
    opencv_face310d.lib
    opencv_features2d310d.lib
    opencv_flann310d.lib
    opencv_fuzzy310d.lib
    opencv_hdf310d.lib
    opencv_highgui310d.lib
    opencv_imgcodecs310d.lib
    opencv_imgproc310d.lib
    opencv_line_descriptor310d.lib
    opencv_ml310d.lib
    opencv_objdetect310d.lib
    opencv_optflow310d.lib
    opencv_photo310d.lib
    opencv_plot310d.lib
    opencv_reg310d.lib
    opencv_rgbd310d.lib
    opencv_saliency310d.lib
    opencv_shape310d.lib
    opencv_stereo310d.lib
    opencv_stitching310d.lib
    opencv_structured_light310d.lib
    opencv_superres310d.lib
    opencv_surface_matching310d.lib
    opencv_text310d.lib
    opencv_tracking310d.lib
    opencv_ts310d.lib
    opencv_video310d.lib
    opencv_videoio310d.lib
    opencv_videostab310d.lib
    opencv_xfeatures2d310d.lib
    opencv_ximgproc310d.lib
    opencv_xobjdetect310d.lib
    opencv_xphoto310d.lib
    ippicvmt.lib

    3、复制有关动态库至系统目录下

    *\opencv\new_build\install\x64\vc14\bin下的dll文件复制至 C:\Windows\System32 和 C:\Windows\SysWOW64 目录下。

    --------------------- 作者:_MICHAEL_LIU_ 来源:CSDN 原文:https://blog.csdn.net/liu798675179/article/details/51259505?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!
  10. 注意:在添加依赖项中不能直接粘贴过去,而是要看你的bin目录下有哪些lib文件,然后将其文件名一个一个粘贴过来,这个过程很麻烦,因此我写了一个C++小程序实现这个功能,实现代码如下。
  11. // Find_Filename.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //功能:扫描特定目录下的所有件名,并返回和保存文件名
    //唐明弘 2018/10/10 星期三
    #include "pch.h"
    #include <io.h>      
    #include <string>    
    #include <vector>    
    #include <iostream>    
    #include <fstream>
    using namespace std;
    //获取特定格式的文件名    
    void getAllFiles(string path, vector<string>& files, vector<string>& filename, string format)
    {
    	long  hFile = 0;//文件句柄  64位下long 改为 intptr_t
    	struct _finddata_t fileinfo;//文件信息 
    	string p;
    	if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1) //文件存在
    	{
    		do
    		{
    			if ((fileinfo.attrib & _A_SUBDIR))//判断是否为文件夹
    			{
    				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//文件夹名中不含"."和".."
    				{
    					files.push_back(p.assign(path).append("\\").append(fileinfo.name)); //保存文件夹名
    					getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, filename,format); //递归遍历文件夹
    				}
    			}
    			else
    			{
    				files.push_back(p.assign(path).append("\\").append(fileinfo.name));//如果不是文件夹,储存文件名
    				filename.push_back(fileinfo.name);
    			}
    		} while (_findnext(hFile, &fileinfo) == 0);
    		_findclose(hFile);
    	}
    }
    
    int main()
    {
    	string filePath = "D:\\document\\Cpp\\opencv\\new_bulid\\install\\x64\\vc15\\bin";
    	vector<string> files;
    	vector<string> filename;
    	string format = "";				 //查找文件的格式
    	getAllFiles(filePath, files,filename,format);
    	int size = files.size();
    	for (int i = 0; i < size; i++)
    	{
    		cout << files[i] << endl;
    	}
    	int size1 = filename.size();
    	ofstream outfile("filename.txt", ios::trunc);
    	
    	for (int j = 0; j < size; j++)
    	{
    		outfile << filename[j]<< "\n";
    		cout << filename[j] << "    was stored!" << endl;
    	}
    	outfile.close();
    	system("pause");
    	return 0;
    }

    这个程序将会把目录下的所有文件名保存在Filename.txt文件中,我们只需要找出其中的dll文件即可。

配置工作到此就全部完成了。