Невозможно сшить изображения через OpenCV в C ++

Мне нужно сшить несколько изображений с помощью OpenCV на C ++, поэтому я написал следующий код:

#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

Что я делаю неправильно? Как я могу это исправить?

Заранее спасибо.


person FrozenHeart    schedule 22.09.2015    source источник


Ответы (2)


cv::Stitchers работает, находя общие черты в отдельных изображениях и используя их, чтобы выяснить, где изображения подходят друг к другу. В ваших образцах, где работает вышивка, вы можете найти много совпадений: синяя крыша, особенности зданий через дорогу и т. Д.

В наборе, где он вам не подходит, нет перекрытия, поэтому алгоритм не может понять, как совместить их вместе. Похоже, вы можете «сшить» эти изображения, просто сложив их вместе. Для этого вы можете использовать hconcat, как описано в этом ответе: https://stackoverflow.com/a/20079134/1737727

person sgvd    schedule 22.09.2015
comment
Хорошо, спасибо за ответ. В любом случае, как я могу объединить эти изображения в одно? У меня есть такие кусочки пазла одинаковой ширины и высоты. Есть ли готовое решение для этого? - person FrozenHeart; 22.09.2015
comment
Похоже, вы можете «сшить» эти изображения, просто сложив их вместе - к сожалению, нет. Будет неизвестное количество вертикальных и горизонтальных фигур со всех сторон. - person FrozenHeart; 22.09.2015
comment
В этом случае вам нужно придумать свой собственный алгоритм, чтобы увидеть, какие изображения совпадают, что-то, где вы сравниваете пиксели в граничных строках / столбцах. Я не знаю никаких встроенных в OpenCV методов, которые делают это, извините. - person sgvd; 22.09.2015

Есть очень простой способ разместить два изображения рядом. Можно использовать следующую функцию, предоставляемую 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 - это аналогичная функция для сшивания изображений по вертикали.

person RAJ KUMAR MISHRA    schedule 04.02.2017