C++opencv识别多张图的特征点并显示
时间: 2023-05-22 12:03:20 浏览: 219
可以使用多种算法来实现多张图像的特征点识别,常见的有SIFT(尺度不变特征变换)、SURF(加速稳健特征)、ORB(Oriented FAST and Rotated BRIEF)、AKAZE(加速KAZE)等。其中,AKAZE是最新的一种算法,能够在旋转、缩放、光照等方面具有良好的稳定性。
以下是使用AKAZE算法识别多张图像的特征点并显示的C++代码片段:
```
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
std::vector<Mat> images;
//读入多张图像, 保存到vector容器中
for(int i=1; i<=3; i++) {
Mat img = imread("image" + std::to_string(i) + ".png");
if(img.empty()) {
std::cout << "Cannot load image: image" + std::to_string(i) + ".png!" << std::endl;
return -1;
}
images.push_back(img);
}
//创建AKAZE特征检测器
Ptr<AKAZE> akaze = AKAZE::create();
//提取每张图像的特征点及描述符
std::vector<KeyPoint> keypoints;
std::vector<Mat> descriptors;
for(int i=0; i<images.size(); i++) {
Mat img;
cvtColor(images[i], img, COLOR_BGR2GRAY);
std::vector<KeyPoint> kp;
Mat descriptor;
akaze->detectAndCompute(img, noArray(), kp, descriptor);
keypoints.push_back(kp);
descriptors.push_back(descriptor);
}
//利用FLANN匹配器匹配特征点
Ptr<DescriptorMatcher> matcher = FlannBasedMatcher::create();
std::vector<std::vector<DMatch> > matches;
std::vector<DMatch> good_matches;
matcher->knnMatch(descriptors[0], descriptors[1], matches, 2);
for(int i=0; i<matches.size(); i++) {
if(matches[i][0].distance < 0.7 * matches[i][1].distance) {
good_matches.push_back(matches[i][0]);
}
}
//绘制匹配结果
Mat img_matches;
drawMatches(images[0], keypoints[0], images[1], keypoints[1],
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
//显示匹配结果
imshow("Matches", img_matches);
waitKey(0);
return 0;
}
```
该代码首先读取多张图像,并使用AKAZE算法提取每张图像的特征点及描述符,然后利用FLANN匹配器匹配图像之间的特征点,并筛选出最匹配的特征点,最后绘制匹配结果并显示。
希望能对你有所帮助!
阅读全文