OpenCV3.4.1+opencv_contrib编译:windows 10

本文介绍了如何在Windows环境下使用CMake和Visual Studio 2015编译OpenCV及其扩展模块opencv_contrib的过程。通过详细步骤指导读者从下载源代码到生成可使用的DLL文件。

做计算机视觉的朋友,估计没有人没用过OpenCV,著名的开源计算机视觉算法库。OpenCV还在不断发展中,最新的3.4版本,已经可以支持cnn了,以后估计会有集成更多的功能。
不过,由于知识产权的原因,OpenCV将很多算法放到了opencv_contrib中,在github上,这两块代码就是分别放在不同的repository中的。
这里写图片描述
OpenCV官方提供了windows可安装的版本,已经有编译好的dll,不过不包括opencv_contrib。如果想应用这部分算法,则需要自己编译opencv,将opencv_contrib编译到opencv中。以下简单介绍以下opencv在windows下编译的过程。
所需材料:

  • opencv源代码
  • opencv_contrib源代码
  • cmake
  • vs2015
  • 一个通畅的网络(这点很重要~)

1.下载opencv源代码
源代码的地址是:https://github.com/opencv/opencv/,默认是master分支。其实都下载master分支,就可以。不过,为了清晰源代码版本,以后还能做到匹配,我选择了tags中的最新版本,3.4.1版本,地址是:
https://github.com/opencv/opencv/tree/3.4.1
代码可通过git下载,用git clone命令即可。也可以在网页上点击Clone or download这个绿色按钮,然后点击download zip就可以。
这里写图片描述

2.下载opencv_contrib源代码
opencv_contrib代码地址是:https://github.com/opencv/opencv_contrib
3.4.1版本代码地址是:https://github.com/opencv/opencv_contrib/tree/3.4.1
相信大家也都发现规律了,参考下载opencv源代码方法即可。
下载后,解压代码到本地目录。
这里写图片描述
上图就是我解压的目录,其中有opencv和opencv_contrib的解压目录,还有一个build目录,用来放置cmake生成的vs工程。
3.安装cmake
CMake是一个跨平台的编译工具,能够输出各种各样的makefile或者project文件。
这里写图片描述
下载地址:https://cmake.org/files/v3.11/cmake-3.11.3-win64-x64.msi
下载之后直接运行,默认安装即可。
4.用cmake生成vs工程
安装好cmake之后,运行cmake,先填写开头的两项
这里写图片描述
Where is the source code是opencv源码路径,即“源路径”
Where to build the binaries是要生成opencv的vs工程路径,即“目的路径”
点击Configure,弹出对话框,选择编译工程的平台。我选的是64位的VS2015
这里写图片描述
点击Finish,即开始配置。这需要一定的时间,期间要下载一些依赖项,此时通畅的网络就起了关键作用,如果下载不全,可通过查看日志文件CMakeDownloadLog.txt手动下载。在完成第一次配置后,出现如下画面。
这里写图片描述
有很多红色选项,说明有问题,解决方法就是再点击一次Configure,这次快多了,出现下面画面。
这里写图片描述
全变白了,说明没问题了,这是需要做两项改动。
这里写图片描述
第一项是勾选BUILD_opencv_world选项,这样,在调用dll时,只调用这一个就行了,不用根据功能选择了,省了些麻烦。
这里写图片描述
这第二项,自然是在OPENCV_EXTRA_MODULES_PATH选项中,填写opencv_contrib解压目录下,modules文件夹的路径,这样就把opencv_contrib编译进去了。
然后再按Configure进行配置,和前面一样,一次红,二次白,不在赘述了。第二次全白了,就可以按Generate按键,生成vs工程文件了。
这里写图片描述
5.用VS2015编译opencv源代码
生成工程完毕,在刚才说的“目的路径”下,可以看到OpenCV工程文件
这里写图片描述
用vs2015打开工程文件,选择Debug x64,点击生成->生成解决方案开始编译,这个过程比较漫长,需要耐心,结果如下。
这里写图片描述
没有错误,然后右击INSTALL,点击“仅用于项目->仅生成INSTALL”
这里写图片描述
即可编译生成dll相关文件,编译过程如下。
这里写图片描述
然后将编译选项调整为Release x64,再重复一下以上的过程。此时在“目的路径”的install目录下,生成了调用dll的全部内容。
这里写图片描述
6.调用生成的dll实现图像处理功能
为了验证生成文件的有效性,新建工程,将库目录和包含目录指定到install文件夹下x64/vc14/lib和include文件夹。处理图片文标准测试图片house
这里写图片描述
测试代码如下:

#include "opencv2/opencv.hpp"  
#include"opencv2/xfeatures2d.hpp"

#if _DEBUG
#pragma comment(lib,"opencv_world341d.lib")
#else
#pragma comment(lib,"opencv_world341.lib")
#endif // _DEBUG

using namespace cv;
using namespace std;

int main(){
    Mat img = imread("E:/PASCAL/OpenCV/house.jpg", CV_LOAD_IMAGE_COLOR);
    Ptr<Feature2D> sift = xfeatures2d::SIFT::create();
    vector<KeyPoint> keypoints;
    Mat descriptors;

    sift->detectAndCompute(img, noArray(), keypoints, descriptors);
    drawKeypoints(img, keypoints, descriptors, Scalar(0, 255, 255));
    imshow("Result", descriptors);
    waitKey(0);

    return 0; 
}

测试结果如下。
这里写图片描述
实现了contrib中sift特征点的提取。

`cv::detail::SiftFeaturesFinder` 是 OpenCV 的 stitching 模块内部用于图像拼接流程中的特征提取器,其设计目的是为拼接算法提供统一的特征提取接口。该类在较新版本的 OpenCV 中无法通过 `opencv2/xfeatures2d.hpp` 获取,原因与其在 OpenCV 架构中的定位有关。 `cv::detail::SiftFeaturesFinder` 属于 `cv::detail` 命名空间,该命名空间通常包含模块内部使用的类和函数,不属于 OpenCV 的公开 API。因此,这类接口可能会在不同版本之间发生变更甚至被移除,而不保证向后兼容性。例如,在 OpenCV 的 stitching 模块源码中,某些实现文件会直接引用 `xfeatures2d` 模块的头文件,如 `opencv2/xfeatures2d.hpp`,但这些引用通常在模块内部使用,并未暴露给开发者[^2]。 另一方面,SIFT 算法本身在 OpenCV 中的实现位于 `opencv_contrib` 模块的 `xfeatures2d` 子模块中。标准的 `cv::SIFT` 类是通过 `cv::SIFT::create()` 创建的公开接口,供开发者直接使用。相比之下,`cv::detail::SiftFeaturesFinder` 是对 `cv::SIFT` 的封装,主要用于拼接流程中统一管理特征提取过程,其生命周期和可用性依赖于 stitching 模块的内部实现细节[^3]。 因此,`cv::detail::SiftFeaturesFinder` 并非设计为供开发者直接调用的公开类,而是一个模块内部使用的辅助类。如果开发者需要使用 SIFT 进行特征提取,应使用 `cv::SIFT::create()` 创建 SIFT 特征检测器,而不是依赖 `cv::detail::SiftFeaturesFinder`。 ### 示例代码 ```cpp #include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> int main() { cv::Mat image = cv::imread("input_image.jpg", cv::IMREAD_GRAYSCALE); if (image.empty()) { std::cerr << "Failed to load image!" << std::endl; return -1; } cv::Ptr<cv::SIFT> sift = cv::SIFT::create(); std::vector<cv::KeyPoint> keypoints; cv::Mat descriptors; sift->detectAndCompute(image, cv::noArray(), keypoints, descriptors); cv::Mat output_image; cv::drawKeypoints(image, keypoints, output_image, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT); cv::imshow("SIFT Keypoints", output_image); cv::waitKey(0); return 0; } ``` ###
评论 92
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值