在用到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)的文件

opencv 在x86上编译加速_特征点

 下载之后,是这两个文件:

opencv 在x86上编译加速_特征点_02

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的根目录中。

opencv 在x86上编译加速_特征点_03

opencv 在x86上编译加速_opencv 在x86上编译加速_04

opencv 在x86上编译加速_opencv_05

开始配置的过程中,会有报错,需要一个个的解决报错,主要是因为有些文件没有下载下来。

opencv 在x86上编译加速_bc_06

opencv 在x86上编译加速_特征点_07

opencv 在x86上编译加速_opencv_08

在文件中搜索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的文件,手动下载之后,然后改名字的样子:

opencv 在x86上编译加速_opencv 在x86上编译加速_09

 将CMakeDownloadLog.txt中所有下载报错的文件,全部处理之后,点击configure,cmake记录区不会再有红色的地方,说明配置成功,以下动图是配置成功的样子:

opencv 在x86上编译加速_特征点_10

cmake中编译opencv_contrib

在上栏界面中的变量中找到BUILD_opencv_world和OPENCV_ENABLE_NONFREE两个变量,在变量后面的方框中勾选,即打上 √,随后,找到OPENCV_EXTRA_MODULES_PATH变量,在此变量后面加上【opencv_contrib4.5.0】文件夹里的【modules文件夹】的路径。最后再次点击【Configure】,直到上栏所有的红色变量变成白色。
如果下栏记录区有红色字体,就按照上面1的步骤重新执行,直到所有的字体都变为白色字体。

opencv 在x86上编译加速_opencv_11


 

生成vs2019的工程,编译opencv的库

opencv 在x86上编译加速_bc_12

 用vs2019打开该工程,在选项卡中的“生成”-“批生成”中:

opencv 在x86上编译加速_特征点_13

 编译的时间会比较长,编译成功之后,是以下的画面:

opencv 在x86上编译加速_特征点_14

 在build/install的路径下,会看到会下载的编译好的opencv的库一样的目录结构:

opencv 在x86上编译加速_c++_15

配置opencv_450的环境:

设置环境变量:

opencv 在x86上编译加速_c++_16

附加包含目录:
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;
}

opencv 在x86上编译加速_特征点_17