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

时间:2015-09-22 13:52:31

标签: c++ opencv opencv3.0

我需要在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);
}

不幸的是,它总是在以下文件中显示“拼接失败” - http://imgur.com/a/32ZNS虽然它适用于这些文件 - http://imgur.com/a/ve5sY

我做错了什么?我该如何解决?

提前致谢。

2 个答案:

答案 0 :(得分:2)

cv::Stitchers通过在单独的图像中查找共同特征并使用它们来确定图像在哪里组合在一起来工作。在您缝合的样品中,您可以发现很多重叠:蓝色屋顶,马路对面建筑物的特征等。

在它失败的集合中,没有重叠,因此算法无法弄清楚如何将它们组合在一起。看起来你可以通过将它们放在一起来“缝合”这些图像。为此,您可以使用hconcat,如此答案所述:https://stackoverflow.com/a/20079134/1737727

答案 1 :(得分:0)

有一种非常简单的方法可以并排显示两个图像。可以使用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与垂直图像相似。