最近在学习一些特征提取及匹配的东西,需要用到SIFT特征匹配,但由于OpenCV3中将OpenCV2中的SIFT部分移到了OpenCV_contrib中了,所以需要配置OpenCV3+contrib。本文使用的是OpenCV3.4.6+contrib3.4.6(注:OpenCV和contrib版本必须一致)。
配置OpenCV3.4.6+contrib3.4.6需要使用cmake进行编译,之后再进行环境变量和属性的配置,但过程较为繁琐,需要较长时间,有兴趣的朋友可以参考此 链接配置。
本文使用的是已经使用cmake编译好的OpenCV3.4.6+contrib3.4.6直接进行配置,点击以下链接获取。
链接:https://pan.baidu.com/s/1-O8Uu-uuMy2oIjmJnPOxjw
提取码:4lhu
将D:\Program Files (x86)\opencv-3.4.6\opencv-3.4.6\x64\vc16\bin添加到环境变量。
我的电脑->属性->高级属性->环境变量->Path->新建
文件->新建->项目->空项目,选择名称和路径后,点击确定。
右键源文件->添加->新建项->C++文件->添加。
把OpenCV的include目录:…\opencv-3.4.6\include ,增加到VC++的包含目录属性列表
将OpenCV的.lib目录:…\opencv-3.4.6\x64\vc16\lib,添加到VC++目录的库目录中
Debug X64 的附加依赖项为:opencv_world346d.lib
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace std;
void main()
{
Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
//Mat img = cv::imread("F://1.png"); //注意这里的//的方向,一开始写反了,怎么都出不来。
Mat img_1 = imread("left.jpg");
Mat img_2 = imread("right.jpg");
//Detect the keypoints
vector<KeyPoint> keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_2);
//Calculate descriptors (feature vectors)
Mat descriptors_1, descriptors_2;
f2d->compute(img_1, keypoints_1, descriptors_1);
f2d->compute(img_2, keypoints_2, descriptors_2);
//Matching descriptor vector using BFMatcher
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
//绘制匹配出的关键点
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
imshow("【match图】", img_matches);
//等待任意按键按下
waitKey(0);
}
本文参考以下链接;
1.VS2017+OpenCV3.4.1+opencv_contrib3.4.1配置(体验跟踪算法)
2.vs2019+opencv3.4.6+contrib3.4.6源码编译