opencv和opencv_contrib在VS2017编译和永久配置

博客适用人群:opencv的初学者及以上

特点1:博客以opencv4.5.0为例,支持opencv3和opencv4的任意版本

特点2:编译的opencv包含了contrib,同时支持cuda和eigen

特点3:一次配置,长期使用

(博客有错误或者不详细的地方,欢迎留言,看到消息就回复)

详细的流程(见目录)如下:

目录

1、下载源码

2、使用CMake编译

3、VS2017编译

4、设置环境变量

5、opencv+opencv_contrib在VS2017下永久配置

6、检验配置是否成功(Sift匹配)


1、下载源码

  opencv  https://github.com/opencv/opencv/releases (各个版本都有)

  opencv_contrib https://github.com/opencv/opencv_contrib/releases (各个版本都有)

我从github下载很慢,找了一个非常好用的镜像, opencv和 opencv_contrib各个版本都有,附链接https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/

注意:opencv和opencv_contrib的版本必须一致。

本教程通用于3.x和4.x的版本,示例为opencv4.5.0

2、使用CMake编译

(1)安装CMake,网址为https://cmake.org/download/。建议版本不低于3.15.0

opencv和opencv_contrib在VS2017编译和永久配置_第1张图片

(2)在任意路径下(不要包含中文路径)新建一个文件夹,命名为opencv(我这里是opencv4cuda,初学者建议新建D:/lib/opencv4cuda文件夹,以后的配置只要把G:改成D:)。将第一步下载的两个文件拷贝其中并解压。同时新建一个空的文件夹install(用来存储编译后的文件)

opencv和opencv_contrib在VS2017编译和永久配置_第2张图片

(3)CMake编译。

设置source和build路径,具体路径设置如下:

opencv和opencv_contrib在VS2017编译和永久配置_第3张图片

点击Configure这时会弹出一个对话框,让你设置生成器,选择Visual Studio 15 2017  设置Optional platform for generator  在这里选择x64。点击Finish,这个时候CMake会开始在install目录下生成一些配置文件,如 CMakeCache.txt 等。出现两个done表示第一次编译成功。

opencv和opencv_contrib在VS2017编译和永久配置_第4张图片

必须修改以下两个参数:

勾选OPENCV_ENABLE_NONFREE

设置OPENCV_EXTRA_MODULES_PATH的路径为G:/lib/opencv4cuda/opencv_contrib-4.5.0/modules

不勾选BUILD_opencv_world,之前为了配置省事,爱勾选这个,但是经常编译不成功)

 

可选择性地设置以下参数:

勾选ENABLE_FAST_MATCH(这个功能是我自己需要用)

勾选WITH_EIGEN、设置Eigen3_DIR和EIGEN_INCLUDE_PATH(前提是电脑已经装了Eigen

勾选WITH_CUDA前提是电脑已经装了cuda,好像是最近的opencv版本才能支持最近的cuda版本,就比如我之前opencv3.4.5就没法支持cuda11.1)

opencv和opencv_contrib在VS2017编译和永久配置_第5张图片

再次点击configure。直到都变为白色。最终结果如下: 没有红色 且 configure done。最后点击Generate

至此,cmake编译完成,这时你可以看到在G:\lib\opencv4cuda\install目录下已经生成了名为OpenCV.sln的VS工程

 

opencv和opencv_contrib在VS2017编译和永久配置_第6张图片

 

3、VS2017编译

(1)以管理员方式运行VS2017。打开D:\opencv\install目录下的OpenCV.sln工程

opencv和opencv_contrib在VS2017编译和永久配置_第7张图片

 

opencv和opencv_contrib在VS2017编译和永久配置_第8张图片

 

(2)设置Debug x64运行环境。右键解决方案,点击生成解决方案。该过程需要的时间较长(我的电脑需要两个小时)

opencv和opencv_contrib在VS2017编译和永久配置_第9张图片

 

(3)右键INSTALL,选择“仅用于项目”,选择“仅生成INSTALL” 

opencv和opencv_contrib在VS2017编译和永久配置_第10张图片

 

(4)将第(2)步中的Debug改成Realese,重复(2)(3)。

至此,D:\opencv\install目录下包含了我们需要的头文件、库文件。

4、设置环境变量

(1)找到电脑环境变量的位置,如下面两个图 。或者通过小娜搜索编辑系统环境变量

opencv和opencv_contrib在VS2017编译和永久配置_第11张图片

opencv和opencv_contrib在VS2017编译和永久配置_第12张图片

(2)双击Path,增加G:\lib\opencv4cuda\install\install\x64\vc15\bin。重启电脑(很多电脑设置环境变量需要重启电脑才能生效)。

opencv和opencv_contrib在VS2017编译和永久配置_第13张图片

5、opencv+opencv_contrib在VS2017下永久配置

(1)在VS2017下新建一个空项目,然后点击视图->其它窗口->属性管理器,这样你就调出了属性管理器,如下图

opencv和opencv_contrib在VS2017编译和永久配置_第14张图片

(2)在属性管理器,右键Debug|x64,添加新项目属性表(P)

opencv和opencv_contrib在VS2017编译和永久配置_第15张图片

 

(3)设置项目属性表的名称和位置(以后任意VS工程想配置opencv,直接在Debug|x64加载这个属性表)

opencv和opencv_contrib在VS2017编译和永久配置_第16张图片

(4)打开刚刚新建的属性表,鼠标双击即可。

opencv和opencv_contrib在VS2017编译和永久配置_第17张图片

通用属性->VC++目录->包含目录添加G:\lib\opencv4cuda\install\install\include\opencv2和G:\lib\opencv4cuda\install\install\include;

opencv和opencv_contrib在VS2017编译和永久配置_第18张图片

通用属性->VC++目录->库目录添加G:\lib\opencv4cuda\install\install\x64\vc15\lib

opencv和opencv_contrib在VS2017编译和永久配置_第19张图片

链接器->输入->附加依赖项中添加附加依赖项,opencv的附加依赖项在下一步

opencv和opencv_contrib在VS2017编译和永久配置_第20张图片

5)获取附加依赖项

在G:\lib\opencv4cuda\install\install\x64\vc15\lib下打开cmd,方法很多种,下面三张图是其中的一种方法

opencv和opencv_contrib在VS2017编译和永久配置_第21张图片

在打开的Windows PowerShell输入 start cmd,然后回车

不管用何种方法,都需要打开类似下图的cmd

opencv和opencv_contrib在VS2017编译和永久配置_第22张图片

在cmd输入dir /b *.lib *>0.txt ,回车。此时在G:\lib\opencv4cuda\install\install\x64\vc15\lib生成了0.txt

opencv和opencv_contrib在VS2017编译和永久配置_第23张图片

从0.txt内找到所有的lib,删掉0.txt、OpenCVConfig.cmake、OpenCVConfig-version.cmake、OpenCVModules.cmake、OpenCVModules-debug.cmake等不是以.lib结尾的文件名。并区分debug和release版本(我是把0.txt拷贝了两份,分别命名为0debug.txt和0release.txt,编辑这两个文件,最后只分别保留debug和release版本的lib)。最后删除0.txt、0debug.txt和0release.txt,否则对后面有影响

opencv和opencv_contrib在VS2017编译和永久配置_第24张图片

6)右键Release|x64,添加新项目属性表(P),命名为opencv450x64,重复(1)、(2)、(3)、(4),但是(4)中的附加依赖项需要更改为release版本的lib。

 

opencv和opencv_contrib在VS2017编译和永久配置_第25张图片

 

6、检验配置是否成功(Sift匹配)

在这里强烈感谢源代码的提供者(我找到的都是转载的,提供方没找到,如果侵权,请联系我及时删除)以及http://www.voidcn.com/article/p-suxhalvx-bny.html

在刚刚配置好的工程,新建一个main.cpp。打开工程所在的文件夹。找一张图片复制其中,复制两次,分别命名为2.jpg和4.jpg.

opencv和opencv_contrib在VS2017编译和永久配置_第26张图片

 

将下方的代码拷贝到main.cpp。运行程序。如果屏幕弹出很多图片则表示配置大功告成!!!如果失败,那就再回头看看哪个步骤没有和博客一致。

#include "opencv2/nonfree/nonfree.hpp"  
#include "opencv2/nonfree/features2d.hpp"  
#include "opencv2/legacy/legacy.hpp"
#include 
#include   

using namespace cv;  
using namespace std;  


int main()  
{  

    //读取图像
    Mat img01=imread("2.jpg");
    Mat img02=imread("4.jpg");
    imshow("original image1",img01);
    imshow("original image2",img02);

    //SIFT特征检测
    SiftFeatureDetector detector;        //定义特点点检测器
    vector keypoint01,keypoint02;//定义两个容器存放特征点
    detector.detect(img01,keypoint01);
    detector.detect(img02,keypoint02);

    //在两幅图中画出检测到的特征点
    Mat out_img01;
    Mat out_img02;
    drawKeypoints(img01,keypoint01,out_img01);
    drawKeypoints(img02,keypoint02,out_img02);
    imshow("特征点图01",out_img01);
    imshow("特征点图02",out_img02);

    //提取特征点的特征向量(128维)
    SiftDescriptorExtractor extractor;
    Mat descriptor01,descriptor02;
    extractor.compute(img01,keypoint01,descriptor01);
    extractor.compute(img02,keypoint02,descriptor02);

    //匹配特征点,主要计算两个特征点特征向量的欧式距离,距离小于某个阈值则认为匹配

    BruteForceMatcher> matcher;
    vector matches;
    Mat img_matches;
    matcher.match(descriptor01,descriptor02,matches);
    drawMatches(img01,keypoint01,img02,keypoint02,matches,img_matches);
    imshow("误匹配消除前",img_matches);

    //RANSAC 消除误匹配特征点 主要分为三个部分:
    //1)根据matches将特征点对齐,将坐标转换为float类型
    //2)使用求基础矩阵方法 findFundamentalMat,得到RansacStatus
    //3)根据RansacStatus来将误匹配的点也即RansacStatus[i]=0的点删除

    //根据matches将特征点对齐,将坐标转换为float类型
    vector R_keypoint01,R_keypoint02;
    for (size_t i=0;ip01,p02;
    for (size_t i=0;i RansacStatus;
    Mat Fundamental= findFundamentalMat(p01,p02,RansacStatus,FM_RANSAC);


    vector RR_keypoint01,RR_keypoint02;
    vector RR_matches;            //重新定义RR_keypoint 和RR_matches来存储新的关键点和匹配矩阵
    int index=0;
    for (size_t i=0;i

 

博客主要参考了

https://blog.csdn.net/CSDNjpl/article/details/98614675

https://blog.csdn.net/qq_37296487/article/details/77995907

https://blog.csdn.net/u012679707/article/details/80410952

https://blog.csdn.net/u010248552/article/details/80416751

感谢这些博主,没有他们的付出,我也很难将opencv和opencv_contrib配置好。
 

 

 

你可能感兴趣的:(opencv,c++,cuda)