写一个orb特征点匹配的C++代码,要求如下:1 将shi-tomasi算法加入 2 加入GMS算法去除误匹配
时间: 2023-05-31 09:05:19 浏览: 200
由于orb特征点匹配的代码比较长,我将简要介绍其实现思路并给出代码框架。
ORB特征点是一种旋转不变性和尺度不变性的特征点,可以用于图像匹配和物体识别等任务。ORB特征点匹配的基本流程如下:
1. 对两张图像进行ORB特征点提取和描述子计算。
2. 利用shi-tomasi算法对提取的特征点进行筛选,保留最优的特征点。
3. 利用GMS算法对匹配结果进行筛选,去除误匹配。
下面是代码框架:
```c
#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/highgui.hpp>
#include <vector>
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
int main()
{
// 读取两张图像
Mat img1 = imread("img1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat img2 = imread("img2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
// 定义ORB特征点检测器和描述子提取器
Ptr<FeatureDetector> detector = ORB::create();
Ptr<DescriptorExtractor> extractor = ORB::create();
// 提取ORB特征点和描述子
vector<KeyPoint> kp1, kp2;
Mat desc1, desc2;
detector->detect(img1, kp1);
extractor->compute(img1, kp1, desc1);
detector->detect(img2, kp2);
extractor->compute(img2, kp2, desc2);
// 利用shi-tomasi算法对特征点进行筛选
// ...
// 进行特征点匹配
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(desc1, desc2, matches);
// 利用GMS算法对匹配结果进行筛选
// ...
// 绘制匹配结果
Mat img_matches;
drawMatches(img1, kp1, img2, kp2, good_matches, img_matches);
// 显示匹配结果
namedWindow("Matches", WINDOW_NORMAL);
imshow("Matches", img_matches);
waitKey(0);
return 0;
}
```
其中,shi-tomasi算法和GMS算法的实现可以参考下面的代码:
```c
// 利用shi-tomasi算法对特征点进行筛选
vector<Point2f> corners1, corners2;
vector<KeyPoint> kp1_new, kp2_new;
for (int i = 0; i < kp1.size(); i++) {
corners1.push_back(kp1[i].pt);
}
for (int i = 0; i < kp2.size(); i++) {
corners2.push_back(kp2[i].pt);
}
vector<uchar> status;
vector<float> err;
calcOpticalFlowPyrLK(img1, img2, corners1, corners2, status, err);
for (int i = 0; i < kp1.size(); i++) {
if (status[i] && kp1[i].response >= min_response) {
kp1_new.push_back(kp1[i]);
kp2_new.push_back(KeyPoint(corners2[i], kp2[i].size));
}
}
kp1 = kp1_new;
kp2 = kp2_new;
// 利用GMS算法对匹配结果进行筛选
vector<DMatch> good_matches;
vector<Point2f> pts1, pts2;
for (int i = 0; i < matches.size(); i++) {
pts1.push_back(kp1[matches[i].queryIdx].pt);
pts2.push_back(kp2[matches[i].trainIdx].pt);
}
GMSMatcher gms;
gms.setPatternSize(8);
gms.setThreshold(0.9);
gms.run(pts1, img1.size(), pts2, img2.size(), matches, good_matches);
```
阅读全文