C++:将两幅图像进行特征点匹配,并且将他们的的匹配区域对应的最小外接矩形提取出来
时间: 2024-09-14 08:10:23 浏览: 46
在C++中,处理图像特征点匹配并提取匹配区域通常涉及计算机视觉库如OpenCV(Open Source Computer Vision Library)。以下是一个简化的步骤概述:
1. **导入所需库**:首先,你需要包含必要的头文件,例如`opencv2/features2d.hpp`用于特征检测,`opencv2/imgproc.hpp`用于图像处理。
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui.hpp>
```
2. **读取图像**:使用`imread()`函数加载需要匹配的两张图片。
```cpp
cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);
```
3. **特征检测**:选择一种特征检测算法,比如SIFT(尺度不变特征变换)或SURF( Speeded Up Robust Features),通过`goodFeaturesToTrack()`或`detectKeyPoints()`等函数获取关键点及其描述符。
```cpp
cv::Ptr<cv::FeatureDetector> detector = cv::ORB::create(); // 使用ORB
std::vector<cv::DMatch> matches;
cv::BFMatcher matcher(cv::NORM_HAMMING, true); // 匹配器,设置距离计算方式
```
4. **匹配特征**:对两个图像的关键点进行匹配。
```cpp
matcher.match(img1 descriptors1, img2 descriptors2, matches);
```
5. **筛选匹配**:去除过于离散的匹配结果,例如使用RANSAC(RANdom SAmple Consensus)来估计基本的相机矩阵。
6. **绘制匹配线**:利用`drawMatches()`函数将匹配的关键点可视化。
```cpp
std::vector<cv::Point2f> points1, points2;
std::vector<cv::DMatch> goodMatches;
for (const auto &match : matches)
{
if (match.distance <= threshold) // 过滤掉距离过大的匹配
goodMatches.push_back(match);
}
img3 = cv::.drawMatches(img1, points1, img2, points2, goodMatches, img3);
```
7. **计算最小外接矩形**:如果需要的是匹配区域的最小外接矩形,可以使用`boundingRect()`函数。先从`goodMatches`中挑选出足够数量的可靠匹配点,然后计算它们围成的矩形。
```cpp
std::vector<cv::Point> corners;
for (const auto &match : goodMatches)
{
corners.push_back(points1[match.queryIdx]);
corners.push_back(points2[match.trainIdx]);
}
cv::Rect boundingBox = cv::minAreaRect(corners);
```
8. **显示结果**:最后,保存或显示包含匹配区域的图片以及最小外接矩形。
```cpp
cv::rectangle(img3, boundingBox, cv::Scalar(0, 0, 255), 2);
cv::imshow("Matched Images", img3);
cv::waitKey();
```
阅读全文