这是我很久以前写的关于配置opencv和Ceres solver第三方依赖库的教程,因此用的是比较老的vs2015,现在vs2019依旧可以适用,但vs2019也可以很方便地直接用vcpkg来配置第三方库,只需要几行命令行语句,不过对网络的要求比较高,非常容易崩,考验耐心,网络要是好的朋友用vcpkg可方便多了。
Opencv+contrib配置
首先就是安装vs2015,下载了压缩文件解压之后得到vs_community.exe;
双击安装,在安装过程中选择自定义安装,然后选择Visual C++。然后按照它的指示一步一步往下做就可以了。
安装好vs2015之后,进去opencv官网下载https://opencv.org/ 合适的opnecv的版本,同时下载相对应的合适的contrib版本https://github.com/opencv/opencv_contrib/releases.。下载完直接解压即可。解压后如图所示:
打开cmake-gui,设置source code——F:/opencv/opencv/sources(即源文件所在位置),build the binaries——F:/opencv/opencv/mybuild(放置编译文件的位置,一般都会新建一个文件夹来放置,方便管理)
点击configure,然后它会让我们选择用什么语言来编译,在这里我们就选择visual studio 14 2015来编译(根据自己电脑所装vs版本来选择),其他默认即可,然后点击右下角finish。Configure后如果显示configuring done ,第一次源码配置就完成了。可能第一次configure后全是红色的,多点几次configure就可以变成白色。
然后找到OPENCV_EXTRA_MODULES_RATH一项,添加刚刚解压后的opencv_contrib-3.4.10中的modules目录,选中之后再次点击configure,显示configuring done后点击Generate开始编译。然后之后会显示Configuring done,Generating done。
这时候可以打开mybuild文件夹下的CMakeDownloadLog.txt,检查所需的文件是否都下载完成(注意,安装过程必须保持联网状态)
如果是打开downloadlog文件是以上内容,那么文件下载成功。
由于所需文件要通过外网下载,通常一般是不能成功下载文件的,那么打开downloadlog文件就是以下的状态,会出现有以下这种反馈。
#try 1
# timeout on name lookup is not supported
# getaddrinfo(3) failed for raw.githubusercontent.com:443
# Couldn't resolve host 'raw.githubusercontent.com'
# Closing connection 0
我就是遇见了这种情况。早些年这个网址还没有被屏蔽,一般早些时候的教程里都没有涉及这部分,在19年20年的教程里有比较多相关的关于下载文件不成功的解决办法,但是大部分都比较缺胳膊少腿。
解决文件不能下载有三种方法,选择其一即可:
- 最好的方法当然是通过科学上网的方式来配置opencv,不过这里有一点需要注意
- https://raw.githubusercontent.com/opencv/opencv_3rdparty/fe71c0ad807fdc33c2178e48e488f1e9b177c39a/ffmpeg/ffmpeg_version.cmake 无法直接下载,而是直接打开了ffmpeg_version.cmake,可以右键网页选择另存为 ffmpeg_version.cmake.txt,然后再改为ffmpeg_version.cmake。这里如果自己新建一个txt,然后直接将网页上的内容拷进去,然后再该后缀为.cmake是不行的,会提示md5不匹配。
- 不同版本的OpenCV对应的 opencv_ffmpeg.dll 等缺失文件的 md5 签名是不一样的
- 不能科学上网的可以从其他途径下载
网上已经有很多博主给出了这些缺失文件,只要将这些所需文件都下载下来放进相应的文件夹,所谓相应的文件夹在downloadlog文件里都有,mismatch_md5那行的第一个第一个引号就是下载文件的位置和对应的文件名,红色框即该文件对应的md5码,框框后面就是对应的网址。
三, 查找raw.githubusercontent.com真实地址,修改系统文件hosts
后来看到一个blog很好地解决了这个无法下载文件的问题,不能成功下载文件的原因是https://raw.githubusercontent.com网站访问不了。
解决方案以win10为例子
1:进入 IPAddress.com 网站查询raw.githubusercontent.com真实地址
2:打开C:\Windows\System32\drivers\etc\hosts,(需要使用管理员权限打开)
追加199.232.68.133 raw.githubusercontent.com如下:
因为hosts文件是系统文件,需要管理员权限修改,但是右键发现并没有以管理员身份打开的选项,因此,可以把hosts文件先剪切到桌面,然后用记事本打开,追加199.232.68.133 raw.githubusercontent.com,然后保存后再把hosts复制到原来的文件夹内。
经过以上操作,再回到Cmake重新configure和generate,此时的downloadlog应该是下图这种状态。
这个时候我们就可以进入下一步了。
打开mybuild文件夹,可以看见OpenCV.sln,打开之后(建议用管理员权限打开,不然可能会出错)
ALL-BUILD右键选择生成(或者重新生成),待成功后,INSTALL右键-仅用于项目-仅生成INSTALL.,生成成功之后,最后到自定义的文件夹(mybuild)确认一下,找到install文件夹,进去查看里面的内容(如下图,注:对于后边配置环境,install文件夹作用就像配置opencv刚解压时的build文件夹一样):。
这一步结束后就剩下配置环境:
- 环境变量配置:
右键计算机-属性-高级系统设置-环境变量-系统变量-PATH-编辑,添加F:\opencv\opencv\mybuild\install\x86\vc14\bin(此处根据自己cmake生成install的路径进行修改,如果是64位的,则选择x64).
- 配置相关目录
随便打开一个项目或者新建一个空项目,点击视图-属性管理器,点开随便哪个项目最左边的三角号,点击Debug|Win32,鼠标移动到Microsoft.Cpp.Win32.user右键-属性
进入Microsoft.Cpp.Win32.user属性页
在通用属性- VC++目录- 包含目录中添加(根据cmake编译路径):
F:\opencv\opencv\mybuild\install\include\opencv2
F:\opencv\opencv\mybuild\install\include\opencv
F:\opencv\opencv\mybuild\install\include
- 添加lib目录,通用属性- VC++目录- 库目录中添加(根据cmake编译路径):
F:\opencv\opencv\mybuild\install\x86\vc14\staticlib
F:\opencv\opencv\mybuild\install\x86\vc14\lib
4、添加依赖项,在通用属性-链接器-输入-附加依赖项中添加
opencv_aruco3410d.lib
opencv_bgsegm3410d.lib
opencv_bioinspired3410d.lib
opencv_calib3d3410d.lib
opencv_ccalib3410d.lib
opencv_core3410d.lib
opencv_datasets3410d.lib
opencv_dnn_objdetect3410d.lib
opencv_dnn3410d.lib
opencv_dpm3410d.lib
opencv_face3410d.lib
opencv_features2d3410d.lib
opencv_flann3410d.lib
opencv_fuzzy3410d.lib
opencv_hfs3410d.lib
opencv_highgui3410d.lib
opencv_img_hash3410d.lib
opencv_imgcodecs3410d.lib
opencv_imgproc3410d.lib
opencv_line_descriptor3410d.lib
opencv_ml3410d.lib
opencv_objdetect3410d.lib
opencv_optflow3410d.lib
opencv_phase_unwrapping3410d.lib
opencv_photo3410d.lib
opencv_plot3410d.lib
opencv_reg3410d.lib
opencv_rgbd3410d.lib
opencv_saliency3410d.lib
opencv_shape3410d.lib
opencv_stereo3410d.lib
opencv_stitching3410d.lib
opencv_structured_light3410d.lib
opencv_superres3410d.lib
opencv_surface_matching3410d.lib
opencv_text3410d.lib
opencv_tracking3410d.lib
opencv_video3410d.lib
opencv_videoio3410d.lib
opencv_videostab3410d.lib
opencv_xfeatures2d3410d.lib
opencv_ximgproc3410d.lib
opencv_xobjdetect3410d.lib
opencv_xphoto3410d.lib
对应的每个版本的依赖项不一样,可以通过以下方法获取链接库列表win+r,输入cmd,输入以下内容
此时打开对应的路径,多了一个0.txt文件,里面存了这个文件夹里所有的链接库名字
注意:记得把0.txt删掉否则对后面有影响,而且0.txt文件里多了0.txt、OpenCVConfig.cmake、OpenCVConfig-version.cmake、OpenCVModules.cmake、OpenCVModules-debug.cmake,复制的时候记得删掉这些多余的内容。
测试
到现在为止,opencv的配置已经全部完成了,可以进行测试了,
#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img_1 = imread("1.jpg", CV_LOAD_IMAGE_COLOR);
Mat img_2 = imread("2.jpg", CV_LOAD_IMAGE_COLOR);
Ptr<Feature2D> sift = xfeatures2d::SIFT::create();
vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
sift->detectAndCompute(img_1, noArray(), keypoints_1, descriptors_1);
sift->detectAndCompute(img_2, noArray(), keypoints_2, descriptors_2);
//绘制特征点(关键点)
drawKeypoints(img_1, keypoints_1, descriptors_1, Scalar(0, 0, 255));
drawKeypoints(img_2, keypoints_2, descriptors_2, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("img_1", descriptors_1);
imshow("img_2", descriptors_2);
waitKey(0);
return 0;
}
参考:
https://www.pianshen.com/article/4494291443/
https://blog.csdn.net/star_of_science/article/details/104406819
https://blog.csdn.net/liujiquan1009/article/details/106162042
Ceres配置
https://blog.csdn.net/wzheng92/article/details/79504709
至于ceres的配置,这个博主已经讲的很清楚了,只需要按照他的步骤走就可以了