前言:为什么要装opencv_contrib
opencv3的版本之后只包含基本内容,众多著名的检测算子(如SIFT、SURF和ORB等内容)因为版权问题转移到了一个名为xfeature2d的第三方库中,而opencv_contrib就包含了xfeature2d这个库的内容,因此必须安装opencv_contrib。如果本来已经装了OpenCV,想要再装OpenCV_contrib,不必卸载OpenCV。直接安装cmake,将opencv重新编译,然后加入OpenCV_contrib即可。原来已经配置好的VS环境也不会受到影响,添加好包含目录和库文件、增加环境变量后,contrib功能直接用就行。
一.准备工作
安装所需软件
(0)Visual Studio 2017的安装不再赘述,随便找个教程就能安装
(1)opencv:https://github.com/opencv/opencv
github中opencv界面如下,点击左上角Branch:master,点击Tags,选择自己需要的版本,然后点击右上角的Clone,点击Download ZIP下载安装包。
我用的是opencv4.3.0版本,你可以选择自己喜欢的版本,但是要注意后期下载opencv_contirb时要选择对应的版本,否则可能失败。我opencv下载完之后解压在了D盘,路径为D:\opencv
(2)opencv_contrib:https://github.com/opencv/opencv_contrib
github中opencv_contrib界面如下,点击左上角Branch:master,点击Tags,选择自己需要的版本,然后点击右上角的Clone,点击Download ZIP下载安装包。
请一定选择和opencv一样的版本号,不然可能会出错。因为我的opencv版本是4.3.0,所以我选择了opencv_contrib 4.3.0。下载完成之后解压即可。我为了方便管理把opencv_contrib 4.3.0解压到了刚刚解压完的opencv中,路径为D:\opencv\opencv_contrib-4.3.0
(3)cmake:https://cmake.org/download/
因为我的opencv是在Visual Studio 2017中Debug x64环境下运行的,所以我选择的版本是Windows win64-x64 ZIP cmake-3.18.0-winx64.zip,下载完之后解压,我解压到了D盘中,路径是D:\cmake
二.正式开始安装
(1)启动cmake
我的cmake安装的路径是D:\cmake,所以它的启动项在D:\cmake\bin中,如图所示,启动cmake-gui,经常用的同学可以在桌面创建快捷方式。
启动cmake之后的界面如图所示:
(2)创建Mybuild用cmake编译opencv+opencv_contrib
首先创建一个Mybuild的文件夹,位置的话方便管理我放在了文件夹opencv中即之前解压的opencv 4.3.0,此文件夹中已经有了build这个文件夹,这是opencv 4.3.0自己的,Mybuild是我们自己创建的,图片如下:
在打开的cmake界面中首先看到Where is the source code(源码在哪里)点击右上角Browse Source按钮选择自己下载的opencv的文件夹下的source文件夹:
点击选择文件夹:
接着看到第二行:Where to build the binaries(在哪里构建二进制文件),点击后面的Browse Build,选择我们刚刚创建的Mybuild文件夹,点击选择文件夹
效果如下:
接着进行第一次配置,点击左下角的Configure:
弹出的对话框
对话框第一项是让你选择电脑上已经安装的Visual Studio版本,我装的是Visual Studio 2017,所以选择Visual Studio 2017.
第二项是让你选择在visual Studio中的开发平台,我用的是x64,所以选择x64
跳过第三个文本框,选择下面四个选项的第一个,点击Finsh开始编译。
编译完第一遍之后如图,
上面的方框中一片红色,我们再次点击Configure:
此使上面的红色消失,下面的文本框中在每次Configure时都会出现红色警告字体,不用在意,效果如下。
接下来是关键步骤,关系到成败:
在cmake界面的上面部分,选择Build_opencv_world选项,在后面的方框里面打勾,这个是为了后面在Visual Studio2017中给项目配置属性时,少输入一点链接库,否则会手动输入几十个链接库
接着勾选OPENCV_ENABLE_NONFREE,在后面打勾
接着找到OPENCV_EXTRA_MODULES_PATH,横条向右拉到底,点击它的后半部分,出现三个点的按钮,点击它,弹出对话框
选择下载解压好的opencv_contrib-4.3.0文件夹下modules文件夹,我的路径为:D:/opencv/opencv_contrib-4.3.0/modules,点击选择文件夹
效果如下:
点击Configure:
上方出现一片红,继续点击Configure
红色消失,如果没消失就继续点击Configure。
最后点击Generate
下面的文本框里面出现Configuring done,Generating done。
注意:
在cmake中不管是勾选一条项目Configure一次,还是勾选多个项目一起Configure都是可行的,只要保证cmake上半部分的选择框的不出现红色就行,出现红色时可以通过多次点击Configure选项消除。
最后点击Open Project,打开OpenCV.sln
这个文件在自己所建立的MyBuild中,因此也可以在Mybuild文件夹里找到并打开,打开后cmake可以关闭或者保持原样都无所谓。
三.Visual Studio 2017中生成解决方案
注意:我参考了不下10篇的博客,以上的内容都可以找到相同的地方,但是接下来的步骤是他们所不具备的,也是我多次安装失败的主要原因。关键是缺少文件,必须单独下载,文件在我的百度云里面,下面是地址(白嫖党的胜利)
文件的百度云和提取码:
链接:https://pan.baidu.com/s/1P2X-r1rfK-svHorbdj4G_w
提取码:kyp6
先把百度云里面下载到的文件,如图所示,全都复制到opencv_contrib-4.3.0/modules/xfeatures2d/src/路径中
复制完以后的结果图如下:
然后回到OpenCV.sln的界面,选择菜单栏上的生成,选择重新生成解决方案,我的是89个方案,每个人的方案可能不同,这个和opencv的版本以及在cmake界面上勾选的内容多少有关,因为有的人要用python、有的人还要用到CUDA加速等内容,生成的时间比较长,耐心等待即可。
重新生成解决方案后我成功80个,失败0个,跳过9个,这里是出错最多的地方,我在阅读了其他人的博客,但是几乎没人提到要把上述我的百度云文件放到指定路径里面,所以生成的时候出现很多错误,另外把上述百度云中的文件安装到指定路径后如果生成后有少量报错,比如报错一个或两个,只要不是你所需要的功能就无伤大雅,可以接受。
接着,在左边的解决方案CMakeTargets下找到INSTALL,右击选择“仅用于项目”下的”仅生成INSTALL“
结果如下
关闭项目,这一阶段结束。
四:环境及路径配置
已经安装过Opencv的小伙伴应该都已经配置过环境,完成以上步骤后,再次配置环境无需删除之前的配置,保留就好,没啥影响。
重点:复制有关动态库至系统目录下*\opencv\Mybuild\install\x64\vc15\bin下的.dll文件复制至 C:\Windows\System32 和 C:\Windows\SysWOW64 目录下。
这一步如果不做的话,后面创建程序时将无法运行。
如图所示:这里体现了之前在cmake中勾选Build_opencv_world的优势,如果不勾选将会出现几十个.dll文件
接着开始配置opencv的环境,首先右击此电脑,【此电脑】-【属性】-【高级系统设置】-【环境变量】-【系统变量】
在【Path】里面添加:D:\opencv\Mybuild\install\x64\vc15\bin(这是我电脑里面的路径,同学们根据自己的路径适当修改)如果 visual studio 在修改环境变量之前就打开了,需要重启visual studio。
接下来新建一个visual studio 2017的C++控制台项目,配置环境,我的项目名字叫feature2D,右击,选择属性;
①配置包含目录:
在属性页中,【VC++目录】—【包含目录】—【编辑】—添加3个目录
D:\opencv\Mybuild\install\include
D:\opencv\Mybuild\install\include\opencv
D:\opencv\Mybuild\install\include\opencv2
结果如图所示:
②配置库目录:
接着上步,在【VC++目录】—【库目录】编辑并添加路径。
路径为:D:\opencv\Mybuild\install\x64\vc15\lib
③配置链接库:
接着上步,在【链接器】—【输入】—【附加的依赖项】,添加文件路径在.lib文件夹内(D:\opencv\Mybuild\install\x64\vc15\lib)。找到以下两个文件名:
opencv_world430d.lib
opencv_img_hash430d.lib
带【d】对应 【Debug x64】位版本。
结果如图所示,环境配置结束。
五:代码测试:SURF特征点检测示例
//--------------------------------------【程序说明】--------------------
// 程序描述:SURF特征点检测示例
//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include"opencv2/xfeatures2d/nonfree.hpp"
#include
using namespace cv;
using namespace xfeatures2d;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
//【0】改变console字体颜色
system("color 2F");
//【0】显示帮助文字
ShowHelpText();
//【1】载入源图片并显示
Mat srcImage1 = imread("1.jpg");
Mat srcImage2 = imread("2.jpg");
if (!srcImage1.data || !srcImage2.data)//检测是否读取成功
{
printf("读取图片错误,请确定目录下是否有imread函数指定名称的图片存在~! \n"); return false;
}
imshow("原始图1", srcImage1);
imshow("原始图2", srcImage2);
//【2】定义需要用到的变量和类
int minHessian = 400;//定义SURF中的hessian阈值特征点检测算子
//SurfFeatureDetector detector( minHessian );//定义一个SurfFeatureDetector(SURF) 特征检测类对象
Ptr<SurfFeatureDetector> detector = SurfFeatureDetector::create(minHessian);//设置SURF特征检测器
std::vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据
//【3】调用detect函数检测出SURF特征关键点,保存在vector容器中
detector->detect(srcImage1, keypoints_1);
detector->detect(srcImage2, keypoints_2);
//【4】绘制特征关键点.
Mat img_keypoints_1; Mat img_keypoints_2;
drawKeypoints(srcImage1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
drawKeypoints(srcImage2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//【5】显示效果图
imshow("特征点检测效果图1", img_keypoints_1);
imshow("特征点检测效果图2", img_keypoints_2);
waitKey(0);
return 0;
}
效果图如下:
总结:
最关键的是将百度云中的文件放到指定的路径之中,并且复制有关动态库\opencv\Mybuild\install\x64\vc15\bin下的.dll文件复制至路径C:\Windows\System32 和 C:\Windows\SysWOW64 目录下。
参考博客
1.https://blog.csdn.net/talender/article/details/82841019
2.https://blog.csdn.net/weixin_42012977/article/details/82992962?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
3.https://blog.csdn.net/GIS_feifei/article/details/102531891
4.https://blog.csdn.net/youlinhuanyan/article/details/104109599