Windows下编译OpenCV+OpenCV_Contrib
0 OpenCV及OpenCV_Contrib
OpenCV_Contrib是OpenCV的扩展模块,其中包含着一些新的算法(可能不稳定)和涉及知识产权保护的算法,OpenCV提供的windows下编译好的动态库并不包括OpenCV_Contrib中的算法,要想使用这些算法需要对OpenCV源码和OpenCV_Contrib源码进行编译,生成完整的动态库,而不是使用官方提供的已经编译好的动态库。
OpenCV对应版本下载链接
OpenCV_Contrib对应版本下载链接
1 准备工作
Windows10(可以上网)
VS2017
CMake3.12.4
OpenCV4.0.1
OpenCV_Contrib4.0.1
1.3 cmake
下载 cmake-3.17.1-win64-x64.zip 压缩包,到 /bin 目录下,点击 cmake-gui 运行。
注:根据操作系统的不同,选择相应的版本,cmake 下载页 https://cmake.org/download/ 或 https://github.com/Kitware/CMake/releases
1.4 OpenCV
首先,选择 “Source code”,下载 GitHub 中的 OpenCV 源码
GitHub 链接 https://github.com/opencv/opencv/releases
其次,按照类似的步骤,在 GitHub 中下载 opencv_contrib 的源码压缩包
GitHub 链接 https://github.com/opencv/opencv_contrib/releases
最后,将两个 zip 包解压缩,等待编译。
2 CMake生成VS2017工程
2.1 OpenCV4.0.1 编译配置
- 1 打开CMake,设置“where is the source”目录为OpenCV文件夹中的source目录;
- 2 设置“where to build binaries”目录为自己新建的编译目录,英文路径;
- 3 点击Configure,弹出对话框选择VS版本。
- 4 选择对应的VS版本,并选择win64,点击Finish。
- 5 等待第1次配置完成,发现有些项是红色的,需要再点击一次configure,发现红色的项变为白色,即完成OpenCV的编译配置。
2.2 OpenCV_Contrib4.0.1编译配置
-
1 设置“OPENCV_EXTRA_MODULES_PATH”的值为opencv_contrib文件夹中的modules
注意目录不能用左斜线,需要用右斜线,否则后续会出现错误!!!
-
2 使“WITH_CUDA”选项未被选中
-
3 使“OPENCV_ENABLE_NONFREE”选项为勾选状态
-
4 使“BUILD_opencv_world”选项为勾选状态,则最终只生成一个动态库。
-
5 点击Configure,第1次配置完成后有选项为红色,再次点击Configure,则红色变为白色,OpenCV_Contrib编译配置完成。
2.3 生成工程
- 1 点击Generate,生成VS工程。
2.4 Python 问题
因为电脑中装了 Python 3.6.4,结果在下面步骤的 Debug 模式下,生成时出现了如下错误:
这是因为安装 python 时,并不会安装 debug 版本,于是,回到 python 安装界面,选择 debug 版本
如此,则可在 debug 模式下,顺利生成相应的库文件
3 VS2017生成解决方案及安装文件
- 1 打开第二步生成的OpenCV.sln,并选择Debug x64调试环境,依次点击生成—>生成解决方案。
- 2 等待一段时间得到如下结果。
- 3 右键点击CMakeTargets下的INSTALL—>仅用于此项目—>仅生成INSTALL,最终在install目录下生成编译好的Debug库。
- 4 将Debug改为Release,再依次点击生成—>生成解决方案,等待一段时间结果如下。
- 5 右键点击CMakeTargets下的INSTALL—>仅用于此项目—>仅生成INSTALL,最终在install目录下生成编译好的Release库。
将 install 目录下生成的所有文件,拷贝到需要进行 OpenCV 配置的文件夹中
4 VS2017配置OpenCV开发环境
4.1 配置环境变量
【此电脑】—>【(右键)属性】—>【高级系统设置】—>【高级(标签)】—>【环境变量】—>(双击)系统变量中的Path—>在变量值里面添加相应的路径。
4.2 VS2017工程包含(include)目录的配置
4.3 VS2017工程库(lib)目录的配置
4.4 链接库的配置
5 测试代码
5.1 导向滤波器(Guided Filter)
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/ximgproc.hpp"
using namespace cv;
int main()
{
Mat guidanceImage = imread("tiananmen1.bmp",0);//读取灰度图
if (!guidanceImage.data)
{
std::cout << "Guidance Image is empty" << std::endl;
return -1;
}
imshow("Guidance",guidanceImage);
Mat srcImage = imread("transmission.jpg",1);
if (!srcImage.data)
{
std::cout << "Source Image is empty" << std::endl;
return -2;
}
imshow("input",srcImage);
Mat res;
ximgproc::guidedFilter(guidanceImage, srcImage, res, 30,0.001,-1);
imshow("result", res);
waitKey(0);
return 0;
}
5.2 SIFT特征
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/xfeatures2d.hpp"
using namespace cv;
int main()
{
Mat srcImage = imread("right.jpg", 1);
if (!srcImage.data)
{
std::cout << "Source Image is empty" << std::endl;
return -1;
}
imshow("srcImage", srcImage);
Ptr<Feature2D> sift = xfeatures2d::SIFT::create();
std::vector<KeyPoint> keypoints;
Mat descriptors;
sift->detectAndCompute(srcImage, noArray(), keypoints, descriptors);
drawKeypoints(srcImage, keypoints, descriptors, Scalar(0, 255, 0));
imshow("sift", descriptors);
waitKey(0);
return 0;
}
5.3 SURF特征
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/xfeatures2d.hpp"
using namespace cv;
int main()
{
Mat srcImage = imread("right.jpg", 1);
if (!srcImage.data)
{
std::cout << "Source Image is empty" << std::endl;
return -1;
}
imshow("srcImage", srcImage);
Ptr<Feature2D> surf = xfeatures2d::SURF::create();
std::vector<KeyPoint> keypoints;
Mat descriptors;
surf->detectAndCompute(srcImage, noArray(), keypoints, descriptors);
drawKeypoints(srcImage, keypoints, descriptors, Scalar(0, 255, 0));
imshow("surf", descriptors);
waitKey(0);
return 0;
}
参考文献
[1] OpenCV3.4.1+opencv_contrib编译:windows10
[2]OpenCV - Windows(win10)编译opencv + opencv_contrib