Surf特征匹配点提纯

原创 2016年08月28日 21:09:37

本文将介绍Surf特征匹配得到的特征匹配点提纯方法

      surf匹配代码:

cv::Ptr<Feature2D> p_ex1 = xfeatures2d::SURF::create();//生成对应描述符
			p_ex1->detect(thisFHalf_1, thisFrameKeypoints);
			p_ex1->detect(nextFHalf_2, nextFrameKeypoints);

			p_ex1->compute(thisFHalf_1, thisFrameKeypoints, thisFrameDescriptor);
			p_ex1->compute(nextFHalf_2, nextFrameKeypoints, nextFrameDescriptor);
std::vector< cv::DMatch > matches_1;
			//std::vector< cv::DMatch > matches_2;
			std::vector<cv::DMatch> good_matches;
			std::vector<cv::DMatch> good_matches2;
			BFMatcher matcher;
			//FlannBasedMatcher matcher;
			//matcher.knnMatch()
			matcher.match(thisFrameDescriptor, nextFrameDescriptor, matches_1);
获得匹配点对matches_1,但是surf获得的匹配点对中存在相当多的误匹配,如何剔除误匹配,提取精度较高的匹配点对。

(一)通过距离判断来提纯,这也是常用的方法      

//消除错配点
			double min_dist = 100;
			double max_dist = 0;
			for (int i = 0; i < matches_1.size(); i++)
			{
				double dist = matches_1[i].distance;
				if (dist < min_dist)
				{
					min_dist = dist;
				}
				if (dist > max_dist)
				{
					max_dist = dist;
				}
			}
			//std::vector<cv::DMatch> good_matches;

			for (int i = 0; i < matches_1.size(); i++)
			{
				if (matches_1[i].distance < (3 * min_dist))
				{
					good_matches.push_back(matches_1[i]);
					//surfgoodnum++;
				}
			}
通常设置3*min_dist,距离越小精度也高,但数量也少。

(二)正反匹配提纯

cv::Mat img_match;
int num = 0;
for (int a = 0; a < matches_1.size(); a++)
{
	for (int b = 0; b < matches_2.size();b++)
	{
            if (thisFrameKeypoints[matches_1[a].queryIdx].pt == thisFrameKeypoints[matches_2[b].trainIdx].pt && nextFrameKeypoints[matches_1[a].trainIdx].pt == nextFrameKeypoints[matches_2[b].queryIdx].pt)
	    {
		if (fabs(thisFrameKeypoints[matches_1[a].queryIdx].pt.x - thisFrameKeypoints[matches_1[a].trainIdx].pt.x)<20 && fabs(thisFrameKeypoints[matches_1[a].queryIdx].pt.y - thisFrameKeypoints[matches_1[a].trainIdx].pt.y)<20)
		{
			good_matches.push_back(matches_1[a]);
		}
						
	 }
     }
}
如果前后都能匹配则认为该点对为匹配点对。(效果不佳,只能去除部分)

(三)单应消除错误匹配点

//单应去除匹配错点
<span style="white-space:pre">	</span>std::vector<cv::Point2f> srcPoints_1, dstPoints_1;
<span style="white-space:pre">	</span>for (std::vector< cv::DMatch >::iterator it = matches_1.begin(); it != matches_1.end(); it++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">	</span>    srcPoints_1.push_back(thisFrameKeypoints[it->queryIdx].pt);//ThisFrame
<span style="white-space:pre">	</span>    dstPoints_1.push_back(nextFrameKeypoints[it->trainIdx].pt);//NextFrame
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>cv::Mat H_1;
<span style="white-space:pre">	</span>float reprojectionThreshold = 0.1;
        std::vector<cv::DMatch> inliers;
<span style="white-space:pre">	</span>std::vector<unsigned char> inliersMask(srcPoints_1.size());
<span style="white-space:pre">	</span>H_1 = findHomography(
<span style="white-space:pre">	</span>      srcPoints_1, dstPoints_1,
<span style="white-space:pre">	</span>      CV_FM_RANSAC, reprojectionThreshold,
<span style="white-space:pre">	</span>      inliersMask);
<span style="white-space:pre">	</span>      for (size_t i = 0; i < inliersMask.size(); i++)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">		</span>   if (inliersMask[i])
<span style="white-space:pre">			</span>inliers.push_back(matches_1[i]);
<span style="white-space:pre">	</span>         }
<span style="white-space:pre">		</span>matches_1.swap(inliers);
<span style="white-space:pre">		</span>std::cout << matches_1.size() << std::endl;
匹配点对根据RANSAC计算单应矩阵,再根据单应矩阵提纯。








版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Matlab-vision包学习-Feature Detection,Extraction and Matching-匹配

Matlab-vision包学习

matlab和c++混合编程---方法和步骤

摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。从Matlab调用C/C++代码及C/C...

tree

kd-tree: k-dimensional tree is a space-partitioningdata structure for organizing points in a k-dimen...

vs项目中头文件(.h)静态库(.lib)和 动态库(.dll )的路径和配置问题

在程序开发中,很多时候需要用到别人开发的工具包,如OpenCV和itk。一般而言,在vs中,很少使用源文件,大部分是使用对类进行声明的头文件(.h)和封装了类的链接库(静态.lib或动态.dll)。如...

Opencv Surf算子特征提取与最优匹配

Opencv中Surf算子提取特征,生成特征描述子,匹配特征的流程跟Sift是完全一致的,这里主要介绍一下整个过程中需要使用到的主要的几个Opencv方法。 1. 特征提取 特征提...
  • dcrmg
  • dcrmg
  • 2016-09-21 01:25
  • 6759

SURF特征点匹配(阈值、绘点方式、匹配方式均可通过滚动条调节)

SURF的原理我不再叙述,本文主要是应用SURF进行两张图片的关键点匹配。         Brute Force匹配和FLANN匹配是opencv二维特征点匹配常见的两种办法,分别对应BFMatc...

使用RANSAC提纯SIFT和SURF特征点,达到鲁棒匹配的效果(OpenCV 2.4.13下,源码)

{CSDN:CODE:2073967} 实验效果图: (kp_graf_1) (kp_graf_3) (不经过任何处理的图像匹配) (使用距离小于最小距离四倍时的匹配效果) (使...

使用RANSAC提纯ORB和BRISK特征点,达到鲁棒匹配的效果(OpenCV 2.4.13下,源码)

{CSDN:CODE:2074001} 实验效果图: (kp_graf_1) (kp_graf_3) (不经过任何处理的图像匹配) (使用距离小于最小距离10倍时的匹配效果,...

使用RANSAC提纯KAZE和AKAZE特征点,达到鲁棒匹配的效果(OpenCV 3.2.0下,源码)

KAZE是EECV 2012年新提出来的特征点检测和描述算法,AKAZE是在KAZE基础上进行改进的,详细原理参见作者官网和github上的源码: http://www.robesafe.com/pe...

ransac算法–基于几何关系的图像特征匹配点对提纯

ransac的原理,有一些不错的资料已经详细的叙述,刚开始学习的时候我看的是Marco Zuliani的>,这份资料讲得不错,想要详细了解其原理的同学不妨看看这份资料。本着实用为主的原则,此处,主要描...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)