当前位置:   article > 正文

OpenCV中使用RANSAC算法实现多张图像拼接_基于ransac图像上下拼接 c++

基于ransac图像上下拼接 c++

思路:

(1)获取图像的特征点,将每张图片的特征点保存到一个vector中;

(2)通过特征点匹配的方法,找到每张图片的共有特征点,并将其保存到一个vector中;

(3)通过RANSAC算法求解出拼接的变换矩阵;

(4)根据变换矩阵对每张图片进行仿射变换

(5)将拼接后的图片进行裁剪;

(6)将裁剪后的图片拼接起来,最终得到拼接后的图片。

C/C++代码实现:

  1. #include <opencv2/opencv.hpp>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6. // 读取图像
  7. vector<Mat> images;
  8. for (int i = 0; i < imageNum; i++)
  9. {
  10. images.push_back(imread(imagePaths[i]));
  11. }
  12. // 获取每张图片的特征点
  13. vector<vector<KeyPoint>> keypoints;
  14. for (int i = 0; i < imageNum; i++)
  15. {
  16. vector<KeyPoint> kps;
  17. Mat descriptors;
  18. Ptr<FeatureDetector> detector = ORB::create();
  19. detector->detectAndCompute(images[i], Mat(), kps, descriptors);
  20. keypoints.push_back(kps);
  21. }
  22. // 找到共有特征点
  23. vector<Point2f> srcPts, dstPts;
  24. for (int i = 0; i < imageNum; i++)
  25. {
  26. for (int j = 0; j < imageNum; j++)
  27. {
  28. if (i != j)
  29. {
  30. vector<DMatch> matches;
  31. Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
  32. matcher->match(descriptors[i], descriptors[j], matches);
  33. // 保存共有特征点
  34. for (int k = 0; k < matches.size(); k++)
  35. {
  36. srcPts.push_back(keypoints[i][matches[k].queryIdx].pt);
  37. dstPts.push_back(keypoints[j][matches[k].trainIdx].pt);
  38. }
  39. }
  40. }
  41. }
  42. // 使用RANSAC算法求解出拼接的变换矩阵
  43. Mat H = findHomography(srcPts, dstPts, RANSAC);
  44. // 根据变换矩阵对每张图片进行仿射变换
  45. vector<Mat> warpedImages;
  46. for (int i = 0; i < imageNum; i++)
  47. {
  48. Mat warpedImage;
  49. warpPerspective(images[i], warpedImage, H, Size(width, height));
  50. warpedImages.push_back(warpedImage);
  51. }
  52. // 将拼接后的图片进行裁剪
  53. Mat result = Mat::zeros(height, width, CV_8UC3);
  54. for (int i = 0; i < imageNum; i++)
  55. {
  56. Mat mask = Mat::zeros(height, width, CV_8UC1);
  57. warpedImages[i].copyTo(result, mask);
  58. }
  59. // 将裁剪后的图片拼接起来
  60. Mat resultImage;
  61. hconcat(warpedImages, resultImage);
  62. // 将拼接后的图片输出
  63. imwrite("result.jpg", resultImage);
  64. return 0;
  65. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/81399
推荐阅读
相关标签
  

闽ICP备14008679号