• 大小: 7KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: C/C++
  • 标签: surf  ransac  

资源简介

surf特征点匹配加上ransac算法去除误匹配特征点,基于opencv实现的,配置好相应环境后可直接运行实现

资源截图

代码片段和文件信息

#include 
#include 
#include 

using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;


void surfMatch_ransac(Mat srcImage1Mat srcImage2Mat&Homgimg_matches) {
//【0】改变console字体颜色  
system(“color 1F“);


//【1】载入原始图片  
/*Mat srcImage1 = imread(“1.jpg“ 1);
Mat srcImage2 = imread(“2.jpg“ 1);*/
Mat copysrcImage1 = srcImage1.clone();
Mat copysrcImage2 = srcImage2.clone();



//【2】使用SURF算子检测关键点  
int minHessian = 800;//SURF算法中的hessian阈值  
//SurfFeatureDetector detector(minHessian);//定义一个SurfFeatureDetector(SURF) 特征检测类对象    
vector keypoints_object keypoints_scene;//vector模板类,存放任意类型的动态数组  
Ptrdetect = SURF::create(minHessian 4 3 true true);
   //【3】调用detect函数检测出SURF特征关键点,保存在vector容器中  
Mat descriptors_object descriptors_scene;
detect->detectAndCompute(srcImage1Mat() keypoints_objectdescriptors_object);
detect->detectAndCompute(srcImage2 Mat()keypoints_scenedescriptors_scene);

//【4】计算描述符(特征向量)  
/*SurfDescriptorExtractor extractor;

extractor.compute(srcImage1 keypoints_object descriptors_object);
extractor.compute(srcImage2 keypoints_scene descriptors_scene);*/

//【5】使用FLANN匹配算子进行匹配  
FlannbasedMatcher matcher;
vector< DMatch > matches;
matcher.match(descriptors_object descriptors_scene matches);
sort(matches.begin() matches.end());
vector< DMatch > good_matches;
int ptsPairs = std::min(30 (int)(matches.size() * 0.15));//匹配点数量不大于20
cout << ptsPairs << endl;
for (int i = 0; i < ptsPairs; i++)
{
good_matches.push_back(matches[i]);//距离最小的50个压入新的DMatch
}
//double max_dist = 0; double min_dist = 100;//最小距离和最大距离  

//    //【6】计算出关键点之间距离的最大值和最小值  
//for (int i = 0; i < descriptors_object.rows; i++)
//{
// double dist = matches[i].distance;
// if (dist < min_dist) min_dist = dist;
// if (dist > max_dist) max_dist = dist;
//}

//printf(“>Max dist 最大距离 : %f \n“ max_dist);
//printf(“>Min dist 最小距离 : %f \n“ min_dist);

////【7】存下匹配距离小于3*min_dist的点对  
//std::vector< DMatch > good_matches;
//for (int i = 0; i < descriptors_object.rows; i++)
//{
// if (matches[i].distance < 3 * min_dist)
// {
// good_matches.push_back(matches[i]);
// }
//}

//绘制出匹配到的关键点  
Mat img_matches;
drawMatches(srcImage1 keypoints_object srcImage2 keypoints_scene
good_matches img_matches Scalar::all(-1) Scalar::all(-1)
vector() DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

//定义两个局部变量  
vector obj;
vector scene;

//从匹配成功的匹配对中获取关键点  
for (unsigned int i = 0; i < good_matches.size(); i++)
{
obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);
}
vector listpoints;

//Mat H = findHomography( obj scene CV_RANSAC );//计算透视变换   
Mat H = findHomography(obj scene CV_RANSAC 3

评论

共有 条评论