由于Opencv3.0以上的版本将SIFT等算法放到contrib中,所以在此记录编译过程。
1.安装VS
学习opencv,一个顺手的集成开发环境少不了,于是采用了微软的Visual Studio,目前最新的版本是2017,但是大部分人用的是VS2015,和VS2013,这是VS2013的安装过程,VS2015也差不多,下载可以去官网。
2.下载和安装Opencv
在官网下载http://opencv.org/有各种版本,找到对应的Win版下载,因为我要使用opencv扩展库中的SIFT,SURF,所以下载了3.1(opencv3将很多不稳定的内容都放到了扩展库中)。下载完成后,打开文件,这是一个解压缩的过程,选择位置,并且不必要新建文件夹,解压缩完成后会生成一个opencv的文件夹。建议放在D盘。
其中,build里面装的是Opencv相关的组件,sources里面是一些源代码。
3.Cmake的下载
Cmake是一个编译工具
https://cmake.org/download/安装很简单,默认安装。
下面那个是免安装的,两个都可以。
4.下载opencv_contrib
就是扩展部分
https://github.com/Itseez/opencv_contrib
下载下来,等着用Cmake编译的时候使用。
5.用Cmake生成sln文件
第一个框是你的opencv下sources安装的目录
第二个框是你之后生成的sln文件的保存目录
然后点击左下角的configure
选择你对应的VS版本,需要注意的是VS2013是12,VS2015是14
这个很重要,对应的版本选不对,后面就有可能出错。
显示configure done 第一次完成。
错误说明:
显示正在下载这个文件,由于网络原因,常下载不了,等待半天之后,就会显示错误,类似的错误还有ippicv这个文件下载不了。
解决这个问题,可以先将这个文件下载下来。(下载地址在文末)
ffmpeg
将ffmpeg目录下的ffmpeg_version.cmake、opencv_ffmpeg.dll、opencv_ffmpeg_64.dll三个文件复制到你的OpenCV路径\opencv\sources\3rdparty\ffmpeg,
然后编辑ffmpeg.cmake,将内容修改为:
message(STATUS "FFMPEG: Package successfully downloaded")
include(${CMAKE_CURRENT_LIST_DIR}/ffmpeg_version.cmake)
ippicv
在你的OpenCV路径\opencv\sources\3rdparty\ippicv” 中创建文件夹unpack,将解压得到的ippicv_win 复制到新创建的unpack 中。
编辑downloader.cmake,将内容修改为:
set(OPENCV_ICV_UNPACK_PATH "${CMAKE_CURRENT_LIST_DIR}/unpack")
set(OPENCV_ICV_PATH "${OPENCV_ICV_UNPACK_PATH}${OPENCV_ICV_PACKAGE_SUBDIR}")
set(OPENCV_ICV_PATH "${OPENCV_ICV_PATH}" PARENT_SCOPE)
我的ffmpeg文件夹内容
ippicv文件夹内容
然后,进行第二次编译
在图中的位置添加刚才opencv_contrib,添加到modules,注意不要直接复制过来,有网友说这样有可能导致错误,尽量避免吧,然后点击configure进行第二次编译
继续编译到所有红色变白为止
然后点击generate
Generating done
错误说明
(1)在进行第二次编译时,看错误说明,ocv_download会出错,这是因为错把PACKAGE写成filename.
CMake Error at D:/opencv/opencv_contrib-master/opencv_contrib-master/modules/dnn_modern/CMakeLists.txt:18 (ocv_download):
Unknown CMake command “ocv_download”.
在D:\opencv\opencv_contrib\modules\dnn_modern\CMakeLists.txt中找到ocv_download 并且把ocv_download后面的filename换成PACKAGE
在D:\opencv\opencv_contrib\modules\xfeatures2d\cmake\download_boostdesc.cmake和D:\opencv\opencv_contrib\modules\xfeatures2d\cmake\download_vgg.cmake中
,处理方法和上面一样。(我的opencv_contrib在D盘)。
到此,安装中Cmake的一部分就结束了。
6.打开sln文件
这是一张之前出错的的截图,我在配置的过程中这一步总是出现各种各样的问题,到最后也没解决,各种版本都安装了几次,最后偶然却通过了,这可能与opencv_contrib不稳定有关系。
出现Link1104类的错误,一般是opencv_contrib的lib中缺少相应的文件,文末的链接中有个install文件夹,里面有一些lib,可以补充一下
个别模块出错,不影像其他的使用。可以用双引号把错误中的关键字括起来,去精准搜索。
选择编译平台,我选的是debug
接下来找到CMakeTargets中的INATALL,对INSTALL单击右键–>仅用于项目–>仅生成 INSTALL
然后在工程目录下看到
选择项目存放位置
![这里写图片描述]
(https://img-blog.csdn.net/20171124170443623?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfNDA2NjYxMzY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
选择空项目
点击解决方案资源管理器,点击源文件,添加新建项。
包含目录中添加
D:\configure3.1\install
D:\configure3.1\install\include\opencv
D:\configure3.1\install\include\opencv2
库目录中添加
D:\configure3.1\install\x86\vc14\lib
链接器中添加
因为前面选的是debug,所以这里的是debug版本,releasev版本少个d(例如opencv_aruco310.lib )
opencv_aruco310d.lib
opencv_bgsegm310d.lib
opencv_calib3d310d.lib
opencv_ccalib310d.lib
opencv_core310d.lib
opencv_datasets310d.lib
opencv_dnn310d.lib
opencv_dpm310d.lib
opencv_face310d.lib
opencv_features2d310d.lib
opencv_flann310d.lib
opencv_fuzzy310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
opencv_line_descriptor310d.lib
opencv_ml310d.lib
opencv_objdetect310d.lib
opencv_optflow310d.lib
opencv_photo310d.lib
opencv_plot310d.lib
opencv_reg310d.lib
opencv_rgbd310d.lib
opencv_saliency310d.lib
opencv_shape310d.lib
opencv_stereo310d.lib
opencv_stitching310d.lib
opencv_structured_light310d.lib
opencv_superres310d.lib
opencv_surface_matching310d.lib
opencv_text310d.lib
opencv_tracking310d.lib
opencv_ts310d.lib
opencv_video310d.lib
opencv_videoio310d.lib
opencv_videostab310d.lib
opencv_xfeatures2d310d.lib
opencv_ximgproc310d.lib
opencv_xobjdetect310d.lib
opencv_xphoto310d.lib
9.进行测试
在刚才源文件,新建项中写入测试代码
using namespace cv;
int main()
{
//载入一张图片,
Mat srcImage = imread("1.jpg");
//显示图片
imshow("【载入原画】", srcImage);
//窗口显示时间,按任意键关闭
waitKey();
}
一切如果正常,显示图片。
图片的位置放在(imread后面的括号内是图片的名称,注意添加格式)
图片路径也可以是绝对路径,但注意用\\符号。
Mat srcImage = imread("D:\\picture\\1.jpg");
SIFT算法测试代码
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
//Create SIFT class pointer
Ptr f2d = xfeatures2d::SIFT::create();
//读入图片
Mat img_1 = imread("4.jpg");
Mat img_2 = imread("5.jpg");
//Detect the keypoints
vector keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_2);
//Calculate descriptors (feature vectors)
Mat descriptors_1, descriptors_2;
f2d->compute(img_1, keypoints_1, descriptors_1);
f2d->compute(img_2, keypoints_2, descriptors_2);
//Matching descriptor vector using BFMatcher
BFMatcher matcher;
vector matches;
matcher.match(descriptors_1, descriptors_2, matches);
//绘制匹配出的关键点
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
imshow("【match图】", img_matches);
//等待任意按键按下
waitKey(600000);
}
错误说明
(1)提示指针越界,有未经处理的异常,一般这时检查图片的后缀名和路径与代码中的是否一致,不行更换路径试试。
(2)无法启动程序
找了一张图,说明这种错误
解决这种错误把相关的dll文件(缺那个拷那个)拷贝到Windows下的,32位系统到System32,64位系统到SysWOW64中
我的目录
(3)关于LINK : fatal error LNK1104: 无法打开文件“opencv_core310d.lib这样的错误
主要是因为包含的库目录中,和包含的附加依赖项不能相互对应照成的
1.工程库(lib)目录的配置“库目录中的路径是否准确。
2.链接库的配置“中“附加依赖项”的格式有没有问题,有没有多空格,版本号310是否正确。
3.环境变量的配置是否准确。
也有可能是这三个文件夹里面缺少相应lib文件造成的(可以试试,文章末尾的链接里面有我上传的相应的lib文件)
(4)无法打开exe文件
一般是程序有问题,重新检查程序,图片路径。
下载链接地址:
http://download.csdn.net/download/qq_40666136/10132331
修改:
已经编译好了一个opencv3.1,contrib install文件,环境VS2017,需要可以下载,只需将Install中文件按上面步骤添加进包含目录,库目录。
[下载地址]
https://download.csdn.net/download/qq_40666136/10773454
文件说明,install和lib文件夹是为了解决问题4,如果里面缺货,看能不能补充,其它几个对应前面的Cmake部分的错误。
有问题请留言
其它错误参考
http://blog.csdn.net/poem_qianmo/article/details/19809337
参考
http://blog.csdn.net/Cooli7wa/article/details/54143624
http://blog.csdn.net/linshuhe1/article/details/51221015#reply
http://blog.csdn.net/qsy2000/article/details/70158537