2021-04-14

VS2017+OpenCV4.3.0+CMake3.20.1+Opencv-Contrib4.3.0开发环境配置(史上最详细步骤记录)。

一、准备工作

  1. 强大的集成开发化境(IDE):Visual Studio 2017 企业版 安装;
    (1)运行安装文件,选择工作负载".NET 桌面开发"、“使用 C++ 的桌面开发”、“ASP.NET 和 Web 开发”、“Python 开发”;
    (2)自定义安装位置,然后安装;
    (3)使用密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF注册;
  2. OpenCV4.3.0下载与安装(解压的过程)
    (1)前往OpenCV官网进行下载;OpenCV官网
    (2)"Library"→"Releasea"→"找到对应的版本"→"Windows "→"等待开始下载"→“得opencv-4.3.0-vc14_vc15.exe”;
    在这里插入图片描述

(3)双击“opencv-4.3.0-vc14_vc15.exe”,自定义解压路径(本人路径:D:\OpenCV4.3.0),等待解压完成,之后,在自定义的的路径下多了一个opencv文件夹,且里边多了build和sources两个文件夹,如果没有,则需要重新解压;在这里插入图片描述

  1. OpenCV-Contrib 下载
    (1)前往GitHub下载OpenCV4.3.0对应版本的OpenCV-Contrib4.3.0(版本一定要对应);
    链接
    (2)“tags”→ “找到对应的版本,点击Zip下载” →“得opencv-contrib-4.3.0.zip”
    在这里插入图片描述
    (3)自定义加压路径,对opencv-contrib-4.3.0.zip进行解压,为了方便管理,本人将其解压到:D:\OpenCV4.3.0\opencv;
    在这里插入图片描述

  2. CMake下载
    (1)到CMake官网进行下载,官网链接,(一定注意,下载自己电脑适配的版本);
    在这里插入图片描述

(2)下载得“cmake-3.20.1-windows-x86_64”,双击进行自定义安装(本人的安装路径:D:\CMake),并选择为所有用户增加系统路径;双击“cmake-gui”便可启动CMake;
在这里插入图片描述

二、利用CMake编译OpenCV4.3.0

(1)启动CMake;
(2)在“where is the source code”处:加载OpenCV4.3.0源码的路径;(本人的路径D:\OpenCV4.3.0\opencv\sources);
(3)在“where to build the binaries”处:加载CMake编译OpenCV4.3.0和OpenCV-Contrib4.3.0的输出,因此需要自定义创建1个文件夹用于存放CMake的编译输出,为了方便管理并区别先前的build文件,本人在D:\OpenCV4.3.0\opencv下创建了MYbuild文件夹;(因此本人此处加载的路径为:D:/OpenCV4.3.0/opencv/MYbuild);
(4)注意:一定要加载自己对应的路径。
在这里插入图片描述
(5)点击Configure,选择参数(如图所示),将源码编译成VS2017相应的工程文件;
在这里插入图片描述
(6)编译完一次之后,如果(Name,Value)框中背景色有红色(如图所示),再次点击Configure进行编译,直至框中的所有项的背景色为白色即可;
在这里插入图片描述
(7)做如图所示的配置:
首先:找到BUILD_opencv_world 和 OPENCV_ENABLE_NONFREE,在后边的小框中的打上“√”;
然后:找到OPENCV_EXTRA_MODULES_PATH, 在后边加载opencv-contrib-4.3.0的modules的路径;(本人的路径为:D:\OpenCV4.3.0\opencv\opencv_contrib-4.3.0\modules);注意,加载自己对应的路径;
在这里插入图片描述

(8)再次点击Configure,如果编译完成之后,还用红色,继续Configure,直至所有红色变白即可;最后点击Generate,直到Generate done;
在这里插入图片描述
(9)此时在D:\OpenCV4.3.0\opencv\MYbuild路径下生成了OpenCV.sln文件;
在这里插入图片描述
(10)可以双击"OpenCV.sln"打开,也可以在CMake界面中“Open Project”打开;此时CMake可开可关,不影响后续操作;本人总共有90个项目,多方面原因导致每个人数目可能都不同;
在这里插入图片描述
总结:上述的这些步骤(在所有的方法中,都大同小异),只要细心,一步一步来,都不会发生错误。

三,重新生成解决方案

通常这一步,是问题比较多的一步,是最需要时间的一步,也是最为关键的一步,决定着整个环境能否配置成功。当然,世上无难事,只要肯放弃!哦,不对,世上无难事,只要不放弃!
(1)在多次尝试以及查阅众多博客中的方法,可知失败的主要原因是缺少个别文件,需要重新单独下载,放到对应的目录中去。就针对OpenCV4.3.0而言,需要单独下载的文件已有前辈下载完成,并放在他的百度网盘中(永久有效),大家可自行下载。

文件的百度云和提取码:
链接:https://pan.baidu.com/s/1P2X-r1rfK-svHorbdj4G_w
提取码:kyp6

本人下载的文件如下:
在这里插入图片描述
(2)将下载的11个文件,拷贝到如下路径:D:\OpenCV4.3.0\opencv\opencv_contrib-4.3.0\modules\xfeatures2d\src(对应好自己的路径);
在这里插入图片描述
(3)打开“OpenCV.sln”,等待分析解决方案中的文件就绪;
在这里插入图片描述
(4)重新生成解决方案:“生成”→“重新生成解决方案”;这个过程比较慢,耐心等待;看进度条,了解进度;本人电脑比较渣,需要一个半小时;
在这里插入图片描述
(5)重新生成之后:成功80个,失败2个,跳过8个;
在这里插入图片描述
错误列表中有四个错误,76个警告;
在这里插入图片描述
则需要对错误和警告进行解决。
(6)解决错误:
对于项目opencv_python3的两个错误不影响使用,所以本人未解决;
对于项目opencv_test_xfeatures2两个错误必须解决,要不然影响使用;
参考博文
具体操作:
首先,从路径 D:\OpenCV4.3.0\opencv\opencv_contrib-4.3.0\modules\xfeatures2d\test 下拷贝以下文件到路径 D:\OpenCV4.3.0\opencv\sources\modules\features2d\test ;(注意,对应好自己的路径;目的是为了保证这两个路径下都有这些文件;)
在这里插入图片描述

//-------------------需要复制的文件有以下7个(下边是文件名)-----------------------------------
test_descriptors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_detectors_regression.impl.hpp
test_features2d.cpp
test_invariance_utils.hpp
test_rotation_and_scale_invariance.cpp
//----------------------------------------------------------------------------
将test_features2d.cpp中的头文件:
#include "features2d/test/test_detectors_regression.impl.hpp"
#include "features2d/test/test_descriptors_regression.impl.hpp"
修改为如下的头文件:
#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"
//---------------------------------------------------------------------------
将test_rotation_and_scale_invariance.cpp中的头文件:
#include "features2d/test/test_detectors_invariance.impl.hpp" 
#include "features2d/test/test_descriptors_invariance.impl.hpp"
修改为如下的头文件:
#include "test_detectors_invariance.impl.hpp" 
#include "test_descriptors_invariance.impl.hpp"

(7)解决警告:
”警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢 失 (编译源文件 D:\OpenCV4.3.0\opencv\opencv_contrib-4.3.0\modules\datasets\src\sr_bsds.cpp)“;
这些警告虽然不影响程序运行,但还是解决一下比较好;
具体操作如下:
首先为VS2017手动添加”高级保存选项“,因为VS2017隐藏了这个命令;
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,就为VS2017手动添加了”高级保存选项“;此时查看是灰色的,先不要紧;
然后,在警告输出列表中双击打开有警告的项目;如下图,
在这里插入图片描述
a.双击 ”ImfPizCompressor.cpp“;
b.然后”文件“→”高级保存选项“(此时正常,进入高级选项保护);
在这里插入图片描述

c.将编码(E)的值修改为适合自己电脑的编码格式;本人设置的如图中所示;然后确定即可;将所有的警告项目均按照此方法进行设置即可;
在这里插入图片描述
(8)再一次重新生成解决方案,耐心等待;
编译的错误和警告如下(已经不影响使用了);
在这里插入图片描述
(9)在解决方案资源管理器找到 ”CMakeTargets“ 中的 ”INSTALL“ 文件,右键选择 ”仅用于项目“ → ”仅生成INSTALL“,等待生成即可;如果成功的话,就会在MYbuild 文件夹中生成名为 install 文件夹(很重要);
在这里插入图片描述
在这里插入图片描述

遗憾的是生成失败了,有错误,
在这里插入图片描述
(10)继续解决错误;
右键 INSTALL 进入 INSTALL的属性页,按图中的指示操作;
在这里插入图片描述
然后,重复(9)的操作,等待,很幸运,成功了;然后查看 install 文件夹中的各个子文件是否文件齐全(只要不是空的,基本都齐全);如下,是本人生成的 install 文件夹;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:在重新生成解决方案的过程中,每个人由于硬件软件等各方面原因导致,可能会遇到各种各样的问题(可能不限于本人遇到的这些问题)。因此,遇到其他问题时,自己应该动手,通过查找资料,解决问题。
本人祝愿大家都一次成功!

测试是否环境配置成功

(1)读取并显示一幅图像;
测试代码如下:

#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat img;
	//img = imread("H:/lena.png");
	img = imread("opencvLogo.jpg");
	if (img.empty())
	{
		cout << "请确认图像名称或路径是否正确!" << endl;
		return -1;
	}
	imshow("test", img);
	waitKey(0);
	return 0;
}

运行结果如下:
在这里插入图片描述
(2)SURF特征点检测

#include<iostream>
#include<opencv2\opencv.hpp>
#include"opencv2/xfeatures2d/nonfree.hpp"

using namespace cv;
using namespace std;
using namespace xfeatures2d;

int main()
{
	Mat Img1 = imread("1.jpg");
	Mat Img2 = imread("2.jpg");
	if (Img1.empty() || Img2.empty())
	{
		cout << "请确认图像名称或路径是否正确!" << endl;
		return -1;
	}
	resize(Img1, Img1, Size(460, 345), 0, 0, INTER_AREA);
	resize(Img2, Img2, Size(460, 345), 0, 0, INTER_AREA);
	imshow("原始图1", Img1);
	imshow("原始图2", Img2);

	//【2】定义必要的变量和类
	int minHessian = 200;//定义SURF中的hessian阈值特征点检测算子;
	Ptr<SurfFeatureDetector> detector = SurfFeatureDetector::create(minHessian);//设置SURF特征检测器;
	std::vector<KeyPoint> keypoints_1, keypoints_2;//vector模板类是能够存放任意类型的动态数组,能够增加和压缩数据;

	//【3】调用detect函数检测出SURF特征关键点,并保存在vector容器中;
	detector->detect(Img1, keypoints_1);
	detector->detect(Img2, keypoints_2);

	//【4】绘制特征关键点;
	Mat img_keypoints_1; Mat img_keypoints_2;
	drawKeypoints(Img1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	drawKeypoints(Img2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);

	//【5】显示效果图
	imshow("效果图1", img_keypoints_1);
	imshow("效果图2", img_keypoints_2);
	imwrite("效果图1.jpg", img_keypoints_1);
	imwrite("效果图2.jpg", img_keypoints_1);

	waitKey(0);
	return 0;
}

运行结果如下:
在这里插入图片描述
(3)特征点匹配

#include<iostream>
#include<opencv2/opencv.hpp> 
#include<opencv2/xfeatures2d.hpp>

using namespace cv; 
using namespace std;
using namespace xfeatures2d;

int main()
{
	Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
	
	Mat img_1 = imread("1.jpg");
	Mat img_2 = imread("2.jpg");

	if (img_1.empty() || img_2.empty())
	{
		cout << "请确认图像名称或路径是否正确!" << endl;
		return -1;
	}
	Mat img_11, img_22;
	resize(img_1, img_11, Size(460, 345), 0, 0, INTER_AREA);
	resize(img_2, img_22, Size(460, 345), 0, 0, INTER_AREA);

	//imshow("1", img_11);
	
	vector<KeyPoint> keypoints_1, keypoints_2;
	f2d->detect(img_11, keypoints_1);
	f2d->detect(img_22, keypoints_2);
	
	Mat descriptors_1, descriptors_2;
	f2d->compute(img_11, keypoints_1, descriptors_1);
	f2d->compute(img_22, keypoints_2, descriptors_2);
	
	BFMatcher matcher;
	vector<DMatch> matches;
	matcher.match(descriptors_1, descriptors_2, matches);

	//绘制匹配出的关键点
	Mat img_matches;
	drawMatches(img_11, keypoints_1, img_22, keypoints_2, matches, img_matches);
	imshow("效果图", img_matches);
	imwrite("效果图.jpg", img_matches);
	
	waitKey(0);
	return 0;
}

运行结果如下:
在这里插入图片描述

致谢

感谢广大博友的贡献,在本人配置此开发环境的过程提供了大量的参考资料,我的成功离不开你们的帮助!
[1]:(https://blog.csdn.net/nohopenolove/article/details/107028598?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242)
[2]:(https://blog.csdn.net/u011171361/article/details/106604408/)
[3]:(https://blog.csdn.net/qq_36226393/article/details/77725493)
[4]:(https://blog.csdn.net/qq_28424857/article/details/82706231)
[5]:(https://blog.csdn.net/nohopenolove/article/details/107028598?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242)
[6]:(https://blog.csdn.net/weixin_41634308/article/details/88675117?utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromMachineLearnPai2default-10.baidujs&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromMachineLearnPai2default-10.baidujs)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值