0、为何需要自行编译opencv3.4与opencv_contrib3.4
因为在3.0之后版本的Opencv对Sift、Sufer等新算法没有提供直接编译好的动态库来加载使用,因此必须自己编译。这是因为Sift、Sufer算法专利现在是属于哥伦比亚大学,因此opencv对这部分内容及“所谓的”不稳定模块全都放到opencv_contrib中。且只在它的Github中能够找到,opencv的官网上是没有的。因此对于想使用Sift、Sufer、双目立体匹配算法、结构光等新的算法及有专利权算法的同学需要自行编译。
1、下载opencv3.4与opencv_contrib3.4相对应的版本
下载需要的Opencv3.4版本源码 https://github.com/opencv/opencv/releases
下载需要的opencv_contrib3.4版本源码 (本文.zip文件) https://github.com/opencv/opencv_contrib/releases
2、Cmake3.10编译Opencv3.4
如何安装Cmake3.10可网上查找很简单的。打开Cmake3.10。
源码路径“Source code”选择你刚才解压后的Opencv3.4源码,本文解压到了D:/Nyy/image/Opencv_Sourse/opencv34路径下,这个需要按照你的路径自行选择。
编译输出路径“build the binaries”,本文新建文件夹“Opencv34Build”路径为D:/Nyy/image/Opencv_Sourse/Opencv34Build,同样这个需要按照你的路径自行选择。
单击“configure”;选择如下图设置,单击“Finish”即可开始编译。
这个过程会出现很多错误需耐心反复编译,主要原因是他要从国外网站下载文件,若下载失败就编译不通过,以红色显示
若失败,可在编译输出路径 D:\Nyy\image\Opencv_Sourse\Opencv34Build 中打开CMakeDownloadLog.txt文件里面有下载失败文件的连接及下载文件要保存到本地的路径。之后你自己可手动打开连接自己下载并放到指定的文件夹中最常下载失败的:opencv_ffmpeg.dll opencv_ffmpeg_64.dll ffmpeg_version.cmake及ippicv_2017u3_win_intel64_general_20170822.zip
下图(D:\Nyy\image\Opencv_Sourse\Opencv34Build 中的CMakeDownloadLog.txt)是我本次编译时下载失败文件的连接及要保存文件的路径,需要每个都自行下载并放到指定位置即可。
在下载完后放到指定文件夹时需把名字修改名字,首先找到指定存储路径“D:\Nyy\image\Opencv_Sourse\opencv34\.cache\ffmpeg”如下图。如把下载的opencv_ffmpeg.dll名字修改为。
所有下载失败的的文件都可以这样操作,同时需要勾选 BUILD_opemcv_world;主要是把所有的lib文件都弄到一个opencv_world340d.lib中方便配置,若不勾选在最后会产生大概38个.lib文件,导致最后配置Opencv3.4到vs2015会太麻烦,有过Opencv2.x配置经验的都知道。
勾选 BUILD_EXAMPLES;就是编译OPencv自带的例程。
完成后再次单击“Configure”即可。单击“Configure”直到Cmake3.10没有红色显示为止。
3、Cmake3.10编译opencv_contrib3.4
选择OPENCV_EXTRA_MODULES_PATH 把路径选择为解压的opencv_contrib3.4文件中的“modules”即D:\Nyy\image\Opencv_Sourse\opencv_contrib34\modules 。如下图:
单击“Configure”在这部分编译中同样会出现下载失败的情况,
同样需要到D:\Nyy\image\Opencv_Sourse\Opencv34Build 中的CMakeDownloadLog.txt中找到下载链接自行下载,并放到指定的位置。此部分下载失败常有:boostdesc_bgm.i boostdesc_bgm_bi.i boostdesc_bgm_hd.i boostdesc_binboost_064.i 及face_landmark_model.dat 同样找到下载并替换。(这里可能需要多次的反复才能完成,需要耐心!!!)
再次单击“Configure”。直到Cmake3.10没有红色显示为止。如下图
最后单击“Generate”完成Cmake3.10编译的最后工作
4、vs2015的最后编译
打来编译输出文件 D:\Nyy\image\Opencv_Sourse\Opencv34Build 找到 Opencv.sln打开工程文件
因为我要编译为Debug X64 因此选择如下图。
此时即可开始编译即:生成->生成解决方案,随后漫长的等待。那个错误是与Python有关不用考虑
选择 CMakeTargets下的INSTALL右键选择仅用于项目->仅生成INSTALL即可,之后会在D:\Nyy\image\Opencv_Sourse\Opencv34Build 找到一个install文件夹即为最后编译生成的Opencv3.4配置需要文件。
5、Opencv3.4与VS2015的配置与测试
我把install文件夹下的内容全部复制到VsOpencv3.4\build文件夹中作为最终的编译文件使用,可以把Opencv34Build内容删除(因为它实在太大了有6.5g大小)
a、将D:\Nyy\image\VsOpencv3.4\build\x64\vc14\bin添加到环境变量
b、将D:\Nyy\image\VsOpencv3.4\build\include D:\Nyy\image\VsOpencv3.4\build\include\opencv D:\Nyy\image\VsOpencv3.4\build\include\opencv2 添加到“包含目录中”
c、将D:\Nyy\image\VsOpencv3.4\build\x64\vc14\lib添加到 “库目录中”
d 、将opencv_world340d.lib添加到“附加依赖库中”
测试代码:
#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("D:/Nyy/image/Images_Data/sift1.jpg", CV_LOAD_IMAGE_COLOR);
Mat img_2 = imread("D:/Nyy/image/Images_Data/sift2.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;
}
测试结果:
这个链接是本文编译好的vs2015 X64Debug下的Opencv3.4+Opencv_contrib3.4文件。包括编译过程中很麻烦下载的的文件opencv_ffmpeg.dll opencv_ffmpeg_64.dll ffmpeg_version.cmake及 ippicv_2017u3_win_intel64_general_20170822.zip boostdesc_bgm.i boostdesc_bgm_bi.i boostdesc_bgm_hd.i boostdesc_binboost_064.i 及face_landmark_model.dat同时包含sift算子的测试代码
4.28 把vs2015 X64Release和vs2015 X64Debug下的Opencv3.4+Opencv_contrib3.4文件再次编译放在VsOpencv3.4DR文件中: 已经再次测试可以运行。