赞
踩
特征点匹配是一种在两幅图像中寻找相互对应的特征点,并建立它们之间的对应关系的过程。具体而言,首先通过特征检测算法在两幅图像中寻找相互对应的特征点,然后,对于每个特征点,通过描述子提取算法计算其描述子,最后,使用匹配算法对两组特征点的描述子进行比较,以找到相互匹配的特征点对。
cv::DMatch::DMatch ( int queryldx,
int _trainldx,
int _imgldx,
float _distance
)
DescriptorMatcher
的介绍 在OpenCV中,特征点匹配的类主要是cv::DescriptorMatcher
。DescriptorMatcher
是一个抽象基类,用于特征点描述子之间的匹配操作。
DescriptorMatcher
类有以下常用方法和函数 1.match()
:对两组特征描述子进行匹配,返回匹配结果(DMatch
对象的向量)。void cv::DescriptorMatcher::match ( InputArray queryDescriptors,
InputArray trainDescriptors,
std::vector< DMatch > & matches,
InputArray mask = noArray()
)const
2.knnMatch()
:对两组特征描述子进行k近邻匹配,返回每个查询描述子的k个最佳匹配结果。void cv::DescriptorMatcher::knnMatch ( InputArray queryDescriptors,
InputArray trainDescriptors,
std::vector< std::vector< DMatch > > & matches,
int k,
InputArray mask = noArray(),
bool compactResult = false
)const
3.radiusMatch()
:对两组特征描述子进行半径匹配,返回每个查询描述子在指定半径内的最佳匹配结果。void cv::DescriptorMatcher::radiusMatch ( InputArray queryDescriptors,
InputArray trainDescriptors,
std::vector< std::vector< DMatch > > &matches,
float maxDistance,
InputArray mask = noArray(),
bool compactResult = false
)const
cv::BFMatcher::BFMatcher ( int normType =ORM_L2,
bool crossCheck = false
)
void cv::drawMatches ( InputArray img1,
const std::vector< KeyPoint > & keypoints1,
InputArray img2,
const std::vector< KeyPoint > & keypoints2,
const std::vector< DMatch > &matches1to2,
InputOutputArray outlmg,
const Scalar & matchColor = scalar: :all(-1),
const Scalar & singlePointColor = scalar: :all(-1),
const std::vector<char>& matchesMask = std: :vector< char >(),
DrawMatchesFlags flags = DrawMatchesFlags: :DEFAULT
)
-
- void orb_fearures(Mat &gray,vector<KeyPoint> &keypoints,Mat &descriptions){
- Ptr<ORB> orb=ORB::create(1000,1.2f);
- orb->detect(gray,keypoints);
- orb->compute(gray,keypoints,descriptions);
- }
- void Matcher_f(Mat img1,Mat img2){
- //提取特征点
- vector<KeyPoint> keypoints1,keypoints2;
- Mat descriptions1,descriptions2;
- //计算特征点
- orb_fearures(img1,keypoints1,descriptions1);
- orb_fearures(img2,keypoints2,descriptions2);
- //特征点匹配
- vector<DMatch> matches;//定义存放匹配结果的变量
- BFMatcher matcher(NORM_HAMMING);//定义特征点匹配的类,使用汉明距离
- matcher.match(descriptions1,descriptions2,matches);//进行特征点匹配
- ostringstream ss;
- ss<<"matches="<<matches.size()<<endl;//匹配成功特征点数目
- //通过汉明距离删选匹配结果
- double min_dist=1000,max_dist=0;
- for(int i=0;i<matches.size();i++){
- double dist=matches[i].distance;
- if(dist<min_dist) min_dist=dist;
- if(dist>max_dist) max_dist=dist;
- }
- //输出所有匹配结果中最大韩明距离和最小汉明距离
- ss<<"min_dist="<<min_dist<<endl;
- ss<<"max_dist="<<max_dist<<endl;
- //将汉明距离较大的匹配点对删除
- vector<DMatch> good_matches;
- for(int i=0;i<matches.size();i++){
- if(matches[i].distance<=max(2*min_dist,20.0)){
- good_matches.push_back(matches[i]);
- }
- }
- ss<<"good_min="<<good_matches.size()<<endl;//剩余特征点数目
- LOGD("%s",ss.str().c_str());
-
- //绘制匹配结果
- Mat outimg,outimg1;
- drawMatches(img1,keypoints1,img2,keypoints2,matches,outimg);
- drawMatches(img1,keypoints1,img2,keypoints2,good_matches,outimg1);
-
- //显示结果
- imwrite("/sdcard/DCIM/outimg.png",outimg);//未筛选结果
- imwrite("/sdcard/DCIM/outimg1.png",outimg1);//最小汉明距离筛选
-
- }

未筛选的特征点匹配结果 :
最小汉明距离筛选特征点匹配结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。