博客适用人群: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匹配)
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
(1)安装CMake,网址为https://cmake.org/download/。建议版本不低于3.15.0
(2)在任意路径下(不要包含中文路径)新建一个文件夹,命名为opencv(我这里是opencv4cuda,初学者建议新建D:/lib/opencv4cuda文件夹,以后的配置只要把G:改成D:)。将第一步下载的两个文件拷贝其中并解压。同时新建一个空的文件夹install(用来存储编译后的文件)
(3)CMake编译。
设置source和build路径,具体路径设置如下:
点击Configure这时会弹出一个对话框,让你设置生成器,选择Visual Studio 15 2017 设置Optional platform for generator 在这里选择x64。点击Finish,这个时候CMake会开始在install目录下生成一些配置文件,如 CMakeCache.txt 等。出现两个done表示第一次编译成功。
必须修改以下两个参数:
勾选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)
再次点击configure。直到都变为白色。最终结果如下: 没有红色 且 configure done。最后点击Generate。
至此,cmake编译完成,这时你可以看到在G:\lib\opencv4cuda\install目录下已经生成了名为OpenCV.sln的VS工程
(1)以管理员方式运行VS2017。打开D:\opencv\install目录下的OpenCV.sln工程
(2)设置Debug x64运行环境。右键解决方案,点击生成解决方案。该过程需要的时间较长(我的电脑需要两个小时)
(3)右键INSTALL,选择“仅用于项目”,选择“仅生成INSTALL”
(4)将第(2)步中的Debug改成Realese,重复(2)(3)。
至此,D:\opencv\install目录下包含了我们需要的头文件、库文件。
(1)找到电脑环境变量的位置,如下面两个图 。或者通过小娜搜索编辑系统环境变量
(2)双击Path,增加G:\lib\opencv4cuda\install\install\x64\vc15\bin。重启电脑(很多电脑设置环境变量需要重启电脑才能生效)。
(1)在VS2017下新建一个空项目,然后点击视图->其它窗口->属性管理器,这样你就调出了属性管理器,如下图
(2)在属性管理器,右键Debug|x64,添加新项目属性表(P)
(3)设置项目属性表的名称和位置(以后任意VS工程想配置opencv,直接在Debug|x64加载这个属性表)
(4)打开刚刚新建的属性表,鼠标双击即可。
在通用属性->VC++目录->包含目录添加G:\lib\opencv4cuda\install\install\include\opencv2和G:\lib\opencv4cuda\install\install\include;
在通用属性->VC++目录->库目录添加G:\lib\opencv4cuda\install\install\x64\vc15\lib
在链接器->输入->附加依赖项中添加附加依赖项,opencv的附加依赖项在下一步
5)获取附加依赖项
在G:\lib\opencv4cuda\install\install\x64\vc15\lib下打开cmd,方法很多种,下面三张图是其中的一种方法
在打开的Windows PowerShell输入 start cmd,然后回车
不管用何种方法,都需要打开类似下图的cmd
在cmd输入dir /b *.lib *>0.txt ,回车。此时在G:\lib\opencv4cuda\install\install\x64\vc15\lib生成了0.txt
从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,否则对后面有影响。
6)右键Release|x64,添加新项目属性表(P),命名为opencv450x64,重复(1)、(2)、(3)、(4),但是(4)中的附加依赖项需要更改为release版本的lib。
在这里强烈感谢源代码的提供者(我找到的都是转载的,提供方没找到,如果侵权,请联系我及时删除)以及http://www.voidcn.com/article/p-suxhalvx-bny.html
在刚刚配置好的工程,新建一个main.cpp。打开工程所在的文件夹。找一张图片复制其中,复制两次,分别命名为2.jpg和4.jpg.
将下方的代码拷贝到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配置好。