赞
踩
(1)获取图像的特征点,将每张图片的特征点保存到一个vector中;
(2)通过特征点匹配的方法,找到每张图片的共有特征点,并将其保存到一个vector中;
(3)通过RANSAC算法求解出拼接的变换矩阵;
(4)根据变换矩阵对每张图片进行仿射变换;
(5)将拼接后的图片进行裁剪;
(6)将裁剪后的图片拼接起来,最终得到拼接后的图片。
- #include <opencv2/opencv.hpp>
- #include <vector>
-
- using namespace std;
-
- int main()
- {
- // 读取图像
- vector<Mat> images;
- for (int i = 0; i < imageNum; i++)
- {
- images.push_back(imread(imagePaths[i]));
- }
-
- // 获取每张图片的特征点
- vector<vector<KeyPoint>> keypoints;
- for (int i = 0; i < imageNum; i++)
- {
- vector<KeyPoint> kps;
- Mat descriptors;
- Ptr<FeatureDetector> detector = ORB::create();
- detector->detectAndCompute(images[i], Mat(), kps, descriptors);
- keypoints.push_back(kps);
- }
-
- // 找到共有特征点
- vector<Point2f> srcPts, dstPts;
- for (int i = 0; i < imageNum; i++)
- {
- for (int j = 0; j < imageNum; j++)
- {
- if (i != j)
- {
- vector<DMatch> matches;
- Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
- matcher->match(descriptors[i], descriptors[j], matches);
- // 保存共有特征点
- for (int k = 0; k < matches.size(); k++)
- {
- srcPts.push_back(keypoints[i][matches[k].queryIdx].pt);
- dstPts.push_back(keypoints[j][matches[k].trainIdx].pt);
- }
- }
- }
- }
-
- // 使用RANSAC算法求解出拼接的变换矩阵
- Mat H = findHomography(srcPts, dstPts, RANSAC);
-
- // 根据变换矩阵对每张图片进行仿射变换
- vector<Mat> warpedImages;
- for (int i = 0; i < imageNum; i++)
- {
- Mat warpedImage;
- warpPerspective(images[i], warpedImage, H, Size(width, height));
- warpedImages.push_back(warpedImage);
- }
-
- // 将拼接后的图片进行裁剪
- Mat result = Mat::zeros(height, width, CV_8UC3);
- for (int i = 0; i < imageNum; i++)
- {
- Mat mask = Mat::zeros(height, width, CV_8UC1);
- warpedImages[i].copyTo(result, mask);
- }
-
- // 将裁剪后的图片拼接起来
- Mat resultImage;
- hconcat(warpedImages, resultImage);
-
- // 将拼接后的图片输出
- imwrite("result.jpg", resultImage);
-
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。