图像拼接之特征点匹配

您所在的位置:网站首页 什么是匹配量和未匹配量的关系 图像拼接之特征点匹配

图像拼接之特征点匹配

2024-07-16 02:38| 来源: 网络整理| 查看: 265

我们在做图像拼接时,最重要的一步就是关于特征点匹配的问题,我们常用到的特征点检测方法有SIFT,SURF以及ORB等,对于特征点匹配我们有Bruteforce方法,Flannbesed方法,这些方法处理完之后,或许特征点匹配效果还是达不到我们想要的结果,这个时候我们需要对我们匹配的特征点进行筛选。下面我来说一说常见的特征点筛选的方法

一丶特征点匹配 这里我们用SIFT方法做例子

Mat img1 = imread("D1.jpg"); Mat img2 = imread("D2.jpg"); //第一步,用SIFT算子检测关键点; SiftFeatureDetector detector; std::vector m_LeftKey, m_RightKey;//构造2个专门由点组成的点向量用来存储特征点 detector.detect(img1, m_LeftKey);//将img1图像中检测到的特征点存储起来放在m_LeftKey中 detector.detect(img2, m_RightKey);//同理 //计算特征向量 SiftDescriptorExtractor extractor;//定义描述子对象 cv::Mat descriptors1, descriptors2;//存放特征向量的矩阵 extractor.compute(srcImage1, m_LeftKey, descriptors1); extractor.compute(srcImage2, m_RightKey, descriptors2); //进行匹配 BruteForceMatchermatcher;//定义一个burte force matcher对象 vector matches;//定义数据类型为matches的vector容器 matcher.match(descriptors1, descriptors2, matches);//匹配两个图像的特征矩阵

结果如下、 原图: 这里写图片描述 这里写图片描述 匹配结果图: 这里写图片描述

效果不好,有很多错误点,下面就是要消除错误的匹配点、

二丶特征点匹配原理 我们知道特征点匹配主要是将每一个相对应的描述子相减,计算出他们的欧式距离。 下面是我自己写的匹配代码,计算速度较慢,不过有助于理解匹配原理。 1)计算向量之间的欧式距离的函数

//每一个位置的描述子相减 double minkowsky(const vector& v1, const vector& v2, double m) { assert(v1.size() == v2.size());//描述子应该都是128维 double ret = 0.0; for (vector::size_type i = 0; i != v1.size(); ++i) { ret += pow(abs(v1[i] - v2[i]), m);//累加每一个向量元素的相减平方值 } return pow(ret, 1.0 / m); } //计算欧式距离 double euclidean(const vector& v1, const vector& v2) { assert(v1.size() == v2.size()); return minkowsky(v1, v2, 2.0); }

2)找出距离最近的点 左图中一个点p1与右图中所有特征点计算欧式距离,找出其距离最近距离的点p2。找出p2点之后,将p2点与左图中所有点计算欧式距离,若距离最近的点为p1,则该两点为匹配点对

//计算距离 Mat m_left_row(1, 128, CV_32S);//创建一个1*128的矩阵 用来保存每一次读取的矩阵 Mat m_right_row(1, 128, CV_32S); Mat m_rightL_row(1, 128, CV_32S); Mat m_leftR_row(1, 128, CV_32S); vectorleft_des, right_des,rightL_des,leftR_des; float dist,dist2; vectordistance1,distance2; int index_l, index_r; int Count = 0; vectorleft_keypoint, right_keypoint; vector matches; DMatch matches1; for (int i = 0; i < keypoints1.size(); i++) { //将左图第i个特征点描述子矩阵读取出来 MatRow(descriptor1, m_left_row, left_des, i); for (int j = 0; j < keypoints2.size(); j++) { MatRow(descriptor2, m_right_row, right_des, j); dist=euclidean(left_des, right_des); // cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3