sift匹配描述子距离判断选择更好的匹配点
2017-09-19 21:27
239 查看
opencv中自带的sift函数,就不过多解释了。
网上太多的大咖,已经都快写烂了,各种函数调用很简单的啦。下面我说一种关于,描述子匹配时,距离判断从而选择更加优良的点!
#include<opencv2/opencv.hpp>
#include<opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main(void)
{
Mat img = imread("C:\\Users\\Lvmeng\\Desktop\\photo-sample\\map1.png");
Mat img2 = imread("C:\\Users\\Lvmeng\\Desktop\\photo-sample\\map2.png");
//显示图像
imshow("image before", img);
imshow("image2 before", img2);
//sift特征检测
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1, kp2;
siftdtc.detect(img, kp1);
Mat outimg1;
drawKeypoints(img, kp1, outimg1);
imshow("image1 keypoints", outimg1);
siftdtc.detect(img2, kp2);
Mat outimg2;
drawKeypoints(img2, kp2, outimg2);
imshow("image2 keypoints", outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1, descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img, kp1, descriptor1);
extractor.compute(img2, kp2, descriptor2);
// imshow("desc", descriptor1);
// imshow("desc2", descriptor2);
//cout << endl << descriptor1 << endl;
matcher.match(descriptor1, descriptor2, matches);
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for (int i = 0; i < descriptor1.rows; i++)
{
double dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}
std::vector< DMatch > good_matches;
for (int i = 0; i <descriptor1.rows; i++) //判断距离从而选择更加优良的点进行匹配
{
if (matches[i].distance < 1.3 * min_dist) //1.3进行修改可以对描述子匹配进行优化!!
{
good_matches.push_back(matches[i]);
}
}
drawMatches(img, kp1, img2, kp2,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow("Result", img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
实验环境:opencv2.43+VS2013。好像是的,不对你再试试呗!
当值设为3的时候,各种的描述子匹配,一头雾水。有不有想撞豆腐的冲动?
设置之后!很清晰嘛!看着自己都觉得爽歪歪了!!
切记,值不能设太小呦,要是做匹配1.5刚刚好!!
网上太多的大咖,已经都快写烂了,各种函数调用很简单的啦。下面我说一种关于,描述子匹配时,距离判断从而选择更加优良的点!
#include<opencv2/opencv.hpp>
#include<opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main(void)
{
Mat img = imread("C:\\Users\\Lvmeng\\Desktop\\photo-sample\\map1.png");
Mat img2 = imread("C:\\Users\\Lvmeng\\Desktop\\photo-sample\\map2.png");
//显示图像
imshow("image before", img);
imshow("image2 before", img2);
//sift特征检测
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1, kp2;
siftdtc.detect(img, kp1);
Mat outimg1;
drawKeypoints(img, kp1, outimg1);
imshow("image1 keypoints", outimg1);
siftdtc.detect(img2, kp2);
Mat outimg2;
drawKeypoints(img2, kp2, outimg2);
imshow("image2 keypoints", outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1, descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img, kp1, descriptor1);
extractor.compute(img2, kp2, descriptor2);
// imshow("desc", descriptor1);
// imshow("desc2", descriptor2);
//cout << endl << descriptor1 << endl;
matcher.match(descriptor1, descriptor2, matches);
double max_dist = 0; double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for (int i = 0; i < descriptor1.rows; i++)
{
double dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}
std::vector< DMatch > good_matches;
for (int i = 0; i <descriptor1.rows; i++) //判断距离从而选择更加优良的点进行匹配
{
if (matches[i].distance < 1.3 * min_dist) //1.3进行修改可以对描述子匹配进行优化!!
{
good_matches.push_back(matches[i]);
}
}
drawMatches(img, kp1, img2, kp2,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imshow("Result", img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
实验环境:opencv2.43+VS2013。好像是的,不对你再试试呗!
当值设为3的时候,各种的描述子匹配,一头雾水。有不有想撞豆腐的冲动?
设置之后!很清晰嘛!看着自己都觉得爽歪歪了!!
切记,值不能设太小呦,要是做匹配1.5刚刚好!!
相关文章推荐
- Sift算子特征点提取、描述及匹配全流程解析
- 特征描述子和特征匹配-SIFT
- Sift算子特征点提取、描述及匹配全流程解析
- opencv3中SIFT配合暴力匹配进行关键点描述和提取
- Sift算子特征点提取、描述及匹配全流程解析
- SIFT特征点检测,特征点描述,特征点匹配理解
- Sift算子特征点提取、描述及匹配全流程解析
- msyql 便捷查询多属性列表,逗号分隔参数判断,查询详情自动匹配已选择属性
- SIFT 特征检测及匹配
- JSP判断radio是否选择和传值栗子(测试应聘人员能力自动计算分数)
- 选择option之后,触发js时间, 判断选择的是什么
- hdu2444The Accomodation of Students(二分图判断+最大匹配)
- SIFT特征详细描述 上
- 【转载】SIFT、SURF匹配点的坐标
- SQL中的选择判断
- 对于大数据,NAS是比SAN更好的选择
- Java实现用栈判断括号匹配问题
- hdu 2444 The Accomodation of Students 二分图判断 + 最大匹配
- JSTL 中的相等判断和选择和非空判断的知识点
- 三维重建(二)Sift特征提取与匹配