经常用到OpenCV,由于各种问题总是经常要重装。记录一下安装OpenCV踩坑过程,希望能够帮到大家,同时也是给自己一个备份,省得以后到处找浪费时间。
这是我参考网上博客的教程配置的过程,只是可行解不一定是最优解,在我的机子上能够成功,由于环境不同,可能会出现不同问题,酌情参考哈哈。
文章目录
基本配置
Windows10
VS2017
opencv-4.1.0-vc14_vc15
opencv_contrib-4.1.0
CMake3.14.0
注意opencv和opencv_contrib版本的匹配。
安装流程
假定已经安装好VS2017和CMake。没有安装的话直接安装就行。由于一些众所周知的原因,contrib编译需要梯子,不然会失败。
一、CMake编译opencv4.1.0和contrib
下载完opencv以及contrib之后,得到的是一个exe文件以及zip文件。
分别解压。我是解压到D:\OpenCV4_1\下。contrib我是直接解压到D盘。
1、添加opencv4.1.0
解压完后,打开CMake,第一个路径选择解压出来的opencv目录下sources文件夹,第二个路径选择你要build的路径,最好不要放在opencv目录下。之后点击configure。
弹出的对话框中选择VS2017,64位平台选择x64,当然也可以选择x86。点击finish。
configure完成之后会出现下面红色的界面。看下框中是否有报错,没有报错的话再点击一次configure。
再次configure后,正常情况下所有红色界面都会变成白色的。
到这一步只是完成了opencv4.1.0的基本模块的部分。接下来要添加contrib部分。
2、添加contrib模块
在上一步的界面中点击勾选BUILD下的BUILD_opencv_world,让之后生成的opencv的lib和dll包含在一个文件opencv_world.lib和opencv_world.dll内。
接下来在OPENCV下勾选OPENCV_ENABLE_NONFREE选项,这样才能使用SIFT等受专利保护的算法。
同时在OPENCV_EXTRA_MODULES_PATH 双击添加解压出来的contrib文件夹下的module文件夹的路径。
选完之后再次点击configure。会出现下面结果,若出现不同的红色选项说明之前选的跟我有出入,只要不报错就可以。
如果没报错,那就再点configure。然后会变成全白,如下:
没有问题,那就点击generate生成。正常结果如下:
显示generating done说明build成功。
到这里CMake步骤完成,接下来就是VS2017配置。
二、VS2017编译生成OpenCV库
在刚刚的build出来的cmake_opencv文件夹内找到OpenCV.sln,用VS2017打开它 。
打开之后注意一下编译器的类型,一般选Debug和x64 。如果要生成release的选择release就好。
在解决方案处右键–>生成解决方案。然后就等待,20多分钟吧,可以来一局游戏或者刷会视频放松放松。。
生成解决方案后,在解决方案处找到INSTALL,然后右键->仅用于项目->仅生成INSTALL。等待生成结束。
生成INSTALL后,在cmake_opencv/install文件夹下就生成了bin,etc,include,x64等文件。
然后就将install内全部文件复制到opencv/build中:
到这里opencv+contrib已经编译完成,下一步就是配置路径,这样才能在VS2017中调用OpenCV。
三、配置VS2017路径
关于路径,主要有添加系统环境变量,VS的包含目录,库目录以及依赖项。
1、添加环境变量
Win10中搜索框内搜索环境变量,点击进去会弹出系统属性对话框,点击对话框内的环境变量,在出现的新对话框中双击Path,在Path中添加D:\OpenCV4_1\opencv\build\bin路径。
2、配置包含目录库目录等
首先创建一个VS工程,添加main.cpp,可以用以下例子来实验。
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
int main()
{
cv::Mat imageL = cv::imread("8.png");
cv::Mat imageR = cv::imread("9.png");
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create();
//特征点
std::vector<cv::KeyPoint> keyPointL, keyPointR;
//单独提取特征点
surf->detect(imageL, keyPointL);
surf->detect(imageR, keyPointR);
//画特征点
cv::Mat keyPointImageL;
cv::Mat keyPointImageR;
drawKeypoints(imageL, keyPointL, keyPointImageL, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(imageR, keyPointR, keyPointImageR, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
//显示窗口
cv::namedWindow("KeyPoints of imageL");
cv::namedWindow("KeyPoints of imageR");
//显示特征点
cv::imshow("KeyPoints of imageL", keyPointImageL);
cv::imshow("KeyPoints of imageR", keyPointImageR);
//特征点匹配
cv::Mat despL, despR;
//提取特征点并计算特征描述子
surf->detectAndCompute(imageL, cv::Mat(), keyPointL, despL);
surf->detectAndCompute(imageR, cv::Mat(), keyPointR, despR);
std::vector<cv::DMatch> matches;
//如果采用flannBased方法 那么 desp通过orb的到的类型不同需要先转换类型
if (despL.type() != CV_32F || despR.type() != CV_32F)
{
despL.convertTo(despL, CV_32F);
despR.convertTo(despR, CV_32F);
}
cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("FlannBased");
matcher->match(despL, despR, matches);
//计算特征点距离的最大值
double maxDist = 0;
for (int i = 0; i < despL.rows; i++)
{
double dist = matches[i].distance;
if (dist > maxDist)
maxDist = dist;
}
//挑选好的匹配点
std::vector< cv::DMatch > good_matches;
for (int i = 0; i < despL.rows; i++)
{
if (matches[i].distance < 0.5*maxDist)
{
good_matches.push_back(matches[i]);
}
}
cv::Mat imageOutput;
cv::drawMatches(imageL, keyPointL, imageR, keyPointR, good_matches, imageOutput);
cv::namedWindow("picture of matching");
cv::imshow("picture of matching", imageOutput);
cv::waitKey(0);
return 0;
}
在新建的工程中依次点击 视图->属性管理器
在左侧的属性管理器中点开,选择刚刚的Debug x64 ->鼠标放到Microsoft.Cpp.x64.user上点击右键->属性,打开属性面板。
双击包含目录,添加以下路径(自己的相应路径),确定:
再在库目录中添加D:\OpenCV4_1\opencv\build\x64\vc15\bin,确定:
3、接下来添加附加依赖项
在刚刚的Microsoft.Cpp.x64.user属性页中点击 链接器->输入->附加依赖项 ->添加opencv_world410d.lib,确定 。
至此基本配置全部完成!!
运行我们新建的工程,通过SURF算法可以得到两幅图片的特征点以及匹配结果(结果不理想,还得调参哈哈),说明SURF能用。
结果虽然不理想,但至少安装是成功的,撒花!!!
。
。
P.S.
刚刚生成的cmake_opencv文件夹很大,我这生成的有9.3G,如果空间不足的话可以直接删除。。
最后剩下的OpenCV库有1.3G,大小还行,可以接受。
如果你跟着我一步一步配置下来,还是没有成功的话,,,
这里有我编译好的基本模块+contrib库,可以拿去试试:百度云 提取码:evjy
应该直接配置VS路径就行了 …
参考
https://blog.csdn.net/weixin_42171170/article/details/105250977