为何需要自行编译opencv3.4与opencv_contrib3.4?
因为在3.0之后版本的Opencv对Sift、Sufer等新算法没有提供直接编译好的动态库来加载使用,因此必须自己编译。这是因为Sift、Sufer算法专利现在是属于哥伦比亚大学,因此opencv对这部分内容及“所谓的”不稳定模块全都放到opencv_contrib中。且只在它的Github中能够找到,opencv的官网上是没有的。因此对于想使用Sift、Sufer、双目立体匹配算法、结构光等新的算法及有专利权算法的同学需要自行编译。
PS: 这里也可以下载source code,只不过之后的 Cmake 阶段的时候,选择 source code的时候直接选择解压的目录即可。
安装包下载地址:https://cmake.org/download/
注意: 图中是3.14.4的版本,我没试过,我用的是3.14.0的版本。
源码路径“Source code”选择你刚才释放后的的Opencv3.4目录下的sources文件夹,本文解压到了D:/src/opencv3.4.0/opencv路径下,这个需要按照你的路径自行选择。
编译输出路径“build the binaries”,本文新建文件夹“Opencv34Build”路径为D:/src/opencv3.4.0/mybuild,同样这个需要按照你的路径自行选择。
单击“configure”;选择如下图设置(VS2015,x64),单击“Finish”即可开始编译。
PS: 这个过程会出现很多错误需耐心反复编译,主要原因是他要从国外网站下载文件,若下载失败就编译不通过,以红色显示若失败,可在编译输出路径 D:\src\opencv3.4.0\build 中打开 CMakeDownloadLog.txt 文件里面有下载失败文件的连接及下载文件要保存到本地的路径。之后你自己可手动打开连接自己下载并放到指定的文件夹中。比如我遇到的:
失败: 下载 tiny-cnn
文件的时候遇到的下载失败的问题 ↓↓↓↓ 打开 CMakeDownloadLog.txt 查看。
解决: 从网上下载 tiny-dnn-1.0.0a3.tar.gz
将其拷贝到 CMakeDownloadLog.txt 相应目录下,并且将压缩包的文件名替换成 CMakeDownloadLog.txt 中的文件名,如图:
在可以选择 configuration 的项之后需要勾选以下几点:
BUILD_opencv_world: 主要是把所有的lib文件都弄到一个opencv_world340d.lib 中方便配置,若不勾选在最后会产生大概 38 个 .lib
文件,导致最后配置 Opencv3.4 到 vs2015 会太麻烦,有过Opencv2.x配置经验的都知道。
BUILD_EXAMPLES: 就是编译Opencv自带的例程。
配置完成后再次单击 Configure
即可,直到Cmake3.10没有红色显示为止。(有红色就继续点,非下载错误的话就先解决)
选择 OPENCV_EXTRA_MODULES_PATH
把路径选择为解压的opencv_contrib3.4文件中的 modules
文件夹,即:D:/src/opencv3.4.0/opencv_contrib/modules。如下图:(注意路径反斜线,不然会出现转义的错误)
单击Configure
在这部分编译中同样会出现下载失败的情况,按照编译opencv3.4中的解决方式来解决,直到最后cmake输出界面显示:
单击Genarate
完成后,同样会出现 “Genarating done” 的字样。
使用VS2015打开 Cmake 编译目录:D:\src\opencv3.4.0\build 下的 OpenCV.sln,来打开项目。
此时即可开始编译即:生成->生成解决方案,随后漫长的等待。
PS: 与Python有关的错误不用考虑。
之后,选择 CMakeTargets下的 INSTALL 右键选择:仅用于项目 -> 仅生成INSTALL,之后会在 D:\src\opencv3.4.0\build 找到一个 install 文件夹即为最后编译生成的 Opencv3.4 配置需要文件。
至此,install 文件夹中的内容就是编译好的,VS2015中所需要的环境。可以单独保存到一个其他的文件夹下,以供VS2015调用,install 目录就可以删除掉了。
vs2015配置:
添加环境变量(重启后才能生效):
D:\env\VsOpencv3.4\x64\vc14\bin
将以下目录,添加到“包含目录中”
D:\env\VsOpencv3.4\include
D:\env\VsOpencv3.4\include\opencv
D:\env\VsOpencv3.4\include\opencv2
将D:\env\VsOpencv3.4\x64\vc14\lib添加到 “库目录中”
将opencv_world340d.lib添加到“附加依赖库中”
测试代码:
// FirstProject.cpp
//
#include
#include
#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:\\dataset\\VOC\\VOC2007\\JPEGImages\\000148.jpg", CV_LOAD_IMAGE_COLOR);
Mat img_2 = imread("D:\\dataset\\VOC\\VOC2007\\JPEGImages\\000149.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;
}
结果如下:
恭喜!!! 成功了!!!