无法通过OpenCV在c++中缝合图像

Unable to stitch images via OpenCV in C++

本文关键字:图像 c++ OpenCV      更新时间:2023-10-16

我需要在c++中使用OpenCV缝合一些图像,因此我编写了以下代码:

#include <opencv2/opencv.hpp>
#include <opencv2/stitching.hpp>
#include <cstdio>
#include <vector>
void main()
{
  std::vector<cv::Mat> vImg;
  cv::Mat rImg;
  vImg.push_back(cv::imread("./stitching_img/S1.png"));
  vImg.push_back(cv::imread("./stitching_img/S2.png"));
  vImg.push_back(cv::imread("./stitching_img/S3.png"));
  cv::Stitcher stitcher = cv::Stitcher::createDefault();
  unsigned long AAtime = 0, BBtime = 0;
  AAtime = cv::getTickCount();
  cv::Stitcher::Status status = stitcher.stitch(vImg, rImg);
  BBtime = cv::getTickCount();
  printf("%.2lf sec n", (BBtime - AAtime) / cv::getTickFrequency());
  if (cv::Stitcher::OK == status)
    cv::imshow("Stitching Result", rImg);
  else
    std::printf("Stitching fail.");
  cv::waitKey(0);
}

不幸的是,它总是说"拼接失败"在以下文件- https://i.stack.imgur.com/5tqvD.jpg当它工作在这些文件- https://i.stack.imgur.com/jMtbC.jpg

我做错了什么?我该怎么修理它?

cv::Stitchers的工作原理是找到单独图像中的共同特征,并使用这些特征来找出图像适合在一起的位置。在拼接工作的样本中,你可以发现很多重叠:蓝色屋顶,马路对面建筑物的特征等。

在你失败的集合中,没有重叠,所以算法无法找出如何将它们组合在一起。似乎你可以通过把它们放在一起来"缝合"这些图像。为此,您可以使用以下答案所描述的hconcat: https://stackoverflow.com/a/20079134/1737727

有一种非常简单的方法可以并排显示两个图像。下面的函数可以使用opencv提供的。

Mat image1, image2;
hconcat(image1,image2,image1);//Syntax->
hconcat(source1,source2,destination);

这个函数还可以用来将一组列从一个图像复制到另一个图像。

Mat image;
Mat columns=image.colRange(20,30);
hconcat(image,columns,image);

vconcat是一个类似于垂直拼接图像的函数。