Невозможно сшить много изображений с помощью класса Stitcher в opencv С++

Я хочу сшить много изображений ( 25 ) в одно изображение прямой поверхности пластиковой детали. Изображения выглядят следующим образом:

введите здесь описание изображения введите здесь описание изображения введите здесь описание изображения введите здесь описание изображения

Я пытаюсь использовать форму класса Stitcher opencv. Мой код здесь:

#include <iostream>
#include <fstream>
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/stitching.hpp>

using namespace std;
using namespace cv;

bool try_use_gpu = false;
vector<Mat> imgs;
string result_name = "result.jpg";
Mat img1, img2,img3,img4,img5,img6,img7, pano;

void printUsage();
//int parseCmdArgs(int argc, char** argv);

int main(int argc, char* argv[])
{
    // Load images from HD.
    img1 = imread("1.bmp");
    img2 = imread("2.bmp");
    img3 = imread("3.bmp");
    img4 = imread("4.bmp"); 

    // Put images into vector of images "imgs".
    imgs.push_back(img1);
    imgs.push_back(img2);
    imgs.push_back(img3);
    imgs.push_back(img4);   

    // Create stitcher instance and use stitch method with imgs.
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
    stitcher.setPanoConfidenceThresh(0.8);
    Stitcher::Status status = stitcher.stitch(imgs, pano);

    if (status != Stitcher::OK)
    {
        cout << "Can't stitch images, error code = " << status << endl;
        return -1;
    }

    imwrite(result_name, pano);

    return 0;
}

Я всегда получаю сообщение об ошибке: «Невозможно сшить изображения, код ошибки = 1», поэтому система говорит, что ей нужно больше изображений. При отладке я вижу, что изображения загружаются правильно, а затем правильно создаются векторные изображения. Какие могут быть причины? Мой расчет также длится довольно долго (2 с)...


person jok23    schedule 17.03.2017    source источник
comment
Можете ли вы сказать размер ваших изображений?   -  person Lakshya Kejriwal    schedule 17.03.2017
comment
ИМХО, Stitcher немного излишен для вашего ввода. Предполагая, что изображения в порядке, они не искажены и камера движется в постоянном направлении вдоль одной оси, вы можете использовать это. Вы можете использовать сопоставление шаблонов, чтобы найти перекрывающиеся участки соседних изображений и использовать это для создания составного изображения. Самый простой способ - просто соединить неперекрывающиеся части. Поочередно сделайте смешивание на частях, которые перекрываются. | Однако идеальным подходом было бы полное устранение необходимости делать это - линейная камера + какой-то кодировщик.   -  person Dan Mašek    schedule 18.03.2017
comment
@skoda23 Очень простой прототип на Python, который генерирует этот результат. Вы можете добавить немного вертикального пространства для покачивания на случай, если срезы не выстраиваются так хорошо, как в вашем явно синтетическом примере. Также добавьте немного смешивания перекрывающихся частей, либо только наполовину, используя addWeighted, либо используя градиент для весов.   -  person Dan Mašek    schedule 19.03.2017
comment
Кстати, было бы удобно, если бы вы предоставили полный набор из 25 изображений, чтобы мы могли провести содержательное сравнение.   -  person Dan Mašek    schedule 19.03.2017
comment
@shawshank Размер изображения составляет около 600 X 400 (зависит от приложения), но не более. Тип используемой камеры: Basler Aca1300 60gm (моно).   -  person jok23    schedule 20.03.2017
comment
@Dan Mašek: Есть ли какой-нибудь пример кода, написанный на C++? Результат от python выглядит очень хорошо. Кроме того, качество изображения не так уж плохо, так как я стремлюсь потерять как можно меньше качества изображения при обработке. Есть ли хороший пример того, как я могу использовать сопоставление шаблонов для создания составного изображения на С++? В настоящее время я не вижу решения, использующего сопоставление шаблонов...   -  person jok23    schedule 20.03.2017
comment
Хорошо, я вижу, вы уже начали его портировать :) посмотри, когда у меня будет немного времени.   -  person Dan Mašek    schedule 20.03.2017
comment
@DanMašek, это супер! ;) Я с нетерпением жду, когда мы решим этот перенос кода с pyton на c++! Я был бы также рад, если бы вы могли немного прокомментировать код Python...   -  person jok23    schedule 21.03.2017
comment
@skoda23 Вот грубая реализация на С++ с поддержкой некоторого вертикального смещения, чтобы вы могли двигаться дальше. Я прокомментирую код Python и C++ и завтра напишу несколько ответов.   -  person Dan Mašek    schedule 22.03.2017
comment
@DanMašek это здорово. В настоящее время я не знаю, как использовать эту грубую реализацию на С++, но я попробую сегодня. Также проверьте мою реализацию кода Python на С++: [ссылка] stackoverflow.com/questions/42905338/ [/ссылка] . Буду очень рад вашим комментариям.   -  person jok23    schedule 22.03.2017


Ответы (1)


Модуль сшивателя OpenCV использует функции изображений для создания точного выравнивания.

Как правило, между двумя изображениями, которые необходимо сшить, должно быть около 20-30% перекрытия. Если между полями камеры нет значительного перекрытия, у вас не будет достаточно признаков между пересечениями изображений. Изображения, которые вы предоставили, имеют достаточно однородный фон, чтобы модуль сшивателя мог найти достаточно признаков на пересечении изображений. Вам нужно будет посмотреть на увеличение функций в пересечении изображений, чтобы выровнять изображения.

person Lakshya Kejriwal    schedule 17.03.2017
comment
Что делать, если я не могу увеличить количество функций? Какие могут быть альтернативные подходы к составлению составного изображения моей местности? Должен ли я использовать какое-либо сопоставление шаблонов? Обратите внимание, что у меня нет большого опыта сопоставления шаблонов. - person jok23; 20.03.2017
comment
Я бы порекомендовал попробовать изменить угол камеры, чтобы увеличить перекрытие между изображениями, или попытаться изменить фон белой части. Поскольку вы не можете увеличить количество функций, сопоставление шаблонов также не даст хороших результатов. - person Lakshya Kejriwal; 20.03.2017