图像镶嵌拼接
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
// 定义图像路径
String img1_path = "image1.tif";
String img2_path = "image2.tif";
// 读取图像
Mat img1 = imread(img1_path, IMREAD_GRAYSCALE);
Mat img2 = imread(img2_path, IMREAD_GRAYSCALE);
// SIFT特征点检测
Ptr<Feature2D> sift = SIFT::create();
vector<KeyPoint> kp1, kp2;
Mat des1, des2;
sift->detectAndCompute(img1, noArray(), kp1, des1);
sift->detectAndCompute(img2, noArray(), kp2, des2);
// 特征点匹配
BFMatcher matcher;
vector<vector<DMatch>> matches;
matcher.knnMatch(des1, des2, matches, 2);
// 筛选匹配结果
vector<DMatch> good_matches;
for (int i = 0; i < matches.size(); ++i) {
if (matches[i][0].distance < 0.75 * matches[i][1].distance) {
good_matches.push_back(matches[i][0]);
}
}
// 获取匹配点坐标
vector<Point2f> src_pts, dst_pts;
for (int i = 0; i < good_matches.size(); ++i) {
src_pts.push_back(kp1[good_matches[i].queryIdx].pt);
dst_pts.push_back(kp2[good_matches[i].trainIdx].pt);
}
// 计算变换矩阵
Mat H = findHomography(src_pts, dst_pts, RANSAC, 5.0);
// 拼接图像
Mat result;
warpPerspective(img1, result, H, Size(img1.cols + img2.cols, img1.rows));
Mat roi(result, Rect(0, 0, img2.cols, img2.rows));
img2.copyTo(roi);
// 显示拼接结果
imshow("Mosaic", result);
waitKey(0);
return 0;
}