在用到opencv中的特征点检测与图像匹配的时候,发现基础的opencv库中没有这个功能,需要下载opencv_contrib的库并进行编译。
平台:windows10
版本相同的opencv源码和opencv_contrib源码:
Release OpenCV 4.5.0 · opencv/opencv · GitHub
Release 4.5.0 · opencv/opencv_contrib · GitHub
我下载的是4.5.0的版本的opencv和opencv_contrib的source code(zip)的文件
下载之后,是这两个文件:
cmake:
下载地址:Download | CMake
我用的是cmake-3.16.0的版本
cmake编译opencv的源码
我的目录的结构方式,在D盘新建一个opencv_450的文件夹,在其中新建source的文件夹放opencv-4.5.0.zip解压后的源码,新建build的文件夹放编译后的结果,将opencv_contrib-4.5.0.zip解压后的文件,放到opencv_450的根目录中。
开始配置的过程中,会有报错,需要一个个的解决报错,主要是因为有些文件没有下载下来。
在文件中搜索cmake_download ,找到每个cmake_download ,后面是文件路径,比如:“D:/3rdpartys/opencv_450/source/.cache/ade/b624b995ec9c439cbc2e9e6ee940d3a2-v0.1.1f.zip”
再后面是文件下载的链接"https://github.com/opencv/ade/archive/v0.1.1f.zip",把下载后的文件修改名字为b624b995ec9c439cbc2e9e6ee940d3a2-v0.1.1f.zip
放到"D:/3rdpartys/opencv_450/source/.cache/ade/b624b995ec9c439cbc2e9e6ee940d3a2-v0.1.1f.zip"
例如,其中的ffmpeg的文件,手动下载之后,然后改名字的样子:
将CMakeDownloadLog.txt中所有下载报错的文件,全部处理之后,点击configure,cmake记录区不会再有红色的地方,说明配置成功,以下动图是配置成功的样子:
cmake中编译opencv_contrib
在上栏界面中的变量中找到BUILD_opencv_world和OPENCV_ENABLE_NONFREE两个变量,在变量后面的方框中勾选,即打上 √,随后,找到OPENCV_EXTRA_MODULES_PATH变量,在此变量后面加上【opencv_contrib4.5.0】文件夹里的【modules文件夹】的路径。最后再次点击【Configure】,直到上栏所有的红色变量变成白色。
如果下栏记录区有红色字体,就按照上面1的步骤重新执行,直到所有的字体都变为白色字体。
生成vs2019的工程,编译opencv的库
用vs2019打开该工程,在选项卡中的“生成”-“批生成”中:
编译的时间会比较长,编译成功之后,是以下的画面:
在build/install的路径下,会看到会下载的编译好的opencv的库一样的目录结构:
配置opencv_450的环境:
设置环境变量:
附加包含目录:
D:\3rdpartys\opencv_450\build\install\include
D:\3rdpartys\opencv_450\build\install\include\opencv2
附加库目录:
D:\3rdpartys\opencv_450\build\install\x64\vc16\lib
附加依赖项_debug:
opencv_world450d.lib
写一个c++的测试程序,调用ORB算子,检测特征点,如下:
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>
using namespace std;
int main()
{
cv::Mat imageL = cv::imread("zidane.jpg");
cv::Mat imageL1, imageR1;
cv::resize(imageL, imageL1, cv::Size(0, 0), 0.25, 0.25, cv::INTER_LINEAR);
cv::Ptr<cv::ORB> orb = cv::ORB::create();
std::vector<cv::KeyPoint> keyPointL;
orb->detect(imageL, keyPointL); //单独提取特征点
cv::Mat keyPointImageL; //画特征点
drawKeypoints(imageL, keyPointL, keyPointImageL, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
cv::namedWindow("鼠标特征带点");
cv::imshow("鼠标特征带点", keyPointImageL);
cv::waitKey(0);
return 0;
}