C++opencv用SIFT识别多张图的特征点并显示
时间: 2023-05-22 09:03:51 浏览: 155
您可以使用以下代码来识别多张图像的SIFT特征点并显示它们:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
// 读入所有图像
vector<Mat> images;
images.push_back(imread("image1.jpg"));
images.push_back(imread("image2.jpg"));
images.push_back(imread("image3.jpg"));
// 初始化SIFT
Ptr<SIFT> sift = SIFT::create();
// 计算每个图像的关键点和描述符
vector<vector<KeyPoint>> keypoints;
vector<Mat> descriptors;
for (int i = 0; i < images.size(); i++) {
Mat gray;
cvtColor(images[i], gray, COLOR_BGR2GRAY);
vector<KeyPoint> kps;
Mat desc;
sift->detectAndCompute(gray, noArray(), kps, desc);
keypoints.push_back(kps);
descriptors.push_back(desc);
}
// 匹配特征点
BFMatcher matcher(NORM_L2, true);
vector<vector<DMatch>> matches;
for (int i = 0; i < descriptors.size(); i++) {
vector<vector<DMatch>> curMatches;
for (int j = 0; j < descriptors.size(); j++) {
if (i == j) {
curMatches.push_back(vector<DMatch>());
} else {
vector<DMatch> tmpMatches;
matcher.match(descriptors[i], descriptors[j], tmpMatches);
// 根据距离从小到大排序,只保留前N个匹配
sort(tmpMatches.begin(), tmpMatches.end());
int cnt = min(50, (int)tmpMatches.size());
curMatches.push_back(vector<DMatch>(tmpMatches.begin(), tmpMatches.begin() + cnt));
}
}
matches.push_back(curMatches);
}
// 显示匹配结果
Mat result;
drawMatches(images[0], keypoints[0], images[1], keypoints[1], matches[0][1], result);
imshow("Matches 1-2", result);
waitKey();
drawMatches(images[1], keypoints[1], images[2], keypoints[2], matches[1][2], result);
imshow("Matches 2-3", result);
waitKey();
drawMatches(images[0], keypoints[0], images[2], keypoints[2], matches[0][2], result);
imshow("Matches 1-3", result);
waitKey();
return 0;
}
```
请注意,您需要在代码中适当更改图像的名称和路径,以使其适用于您的实际用例。