Класс брошюровщиков OpenCV с перекрывающимися стационарными камерами

Я пытаюсь использовать класс брошюровщика OpenCV для сшивания нескольких кадров из стереофонической установки, в которой ни одна камера не перемещается. Я'я получаю плохие результаты сшивания при работе через несколько кадров. Я'Я пробовал несколько разных способов, которые япостараюсь объяснить здесь.

С помощьюstitcher.stitch( )

Учитывая стереопару представлений, я запустил следующий код для некоторых кадров (VideoFile пользовательская оболочка для OpenCVVideoCapture объект):

VideoFile f1( ... );
VideoFile f2( ... );
cv::Mat output_frame;
cv::Stitcher stitcher = cv::Stitcher::createDefault(true);

for( int i = 0; i < num_frames; i++ ) {
    currentFrames.push_back(f1.frame( ));
    currentFrames.push_back(f2.frame( ));
    stitcher.stitch( currentFrames, output_mat );

    // Write output_mat, put it in a named window, etc...

    f1.next_frame();
    f2.next_frame();
    currentFrames.clear();
}

Это дало действительно неплохие результаты для каждого кадра, но так как параметры оцениваются для каждого кадра, вставленного в видео, вы можете увидеть небольшие различия в сшивании, где параметры немного отличаются.

С помощьюestimateTransform( ) & composePanorama( )

Чтобы обойти проблему вышеупомянутого метода, я решил попробовать оценить параметры только в первом кадре, а затем использоватьcomposePanorama( ) прошивать все последующие кадры.

for( int i = 0; i < num_frames; i++ ) {
    currentFrames.push_back(f1.frame( ));
    currentFrames.push_back(f2.frame( ));

    if( ! have_transform ) {
        status = stitcher.estimateTransform( currentFrames );
    }

    status = stitcher.composePanorama(currentFrames, output_frame );

    // ... as above
}

К сожалению, похоже, ошибказадокументировано здесь) очень странное раздвигание двух видов, как на рисунках ниже:

Кадр 1:

Кадр 2:

...

Рамка 8:

Очевидно, что это бесполезно, но я подумал, что это может быть только из-за ошибки, которая в основном продолжает умножать матрицу внутренних параметров на константу каждый разcomposePanorama() называется. Поэтому я сделал небольшое исправление для ошибки, чтобы не допустить этого, но затем результаты сшивания были плохими. Патч ниже (modules/stitching/src/stitcher.cpp), результаты потом:

243             for (size_t i = 0; i < imgs_.size(); ++i)
244             {
245                 // Update intrinsics
246                // change following to *=1 to prevent scaling error, but messes up stitching.
247                 cameras_[i].focal *= compose_work_aspect;
248                 cameras_[i].ppx *= compose_work_aspect;
249                 cameras_[i].ppy *= compose_work_aspect; 

Результаты: 

Кто-нибудь знает, как я могу решить эту проблему? В основном мне нужно выработать преобразованиеодин раз, затем используйте его на оставшихся кадрах (мы30 минут видео).

В идеале мне нужен совет по исправлению класса брошюровщика, но я бы хотел попробовать вручную написать другое решение. Более ранняя попытка, которая заключалась в нахождении точек SURF, их корреляции и нахождении гомографии, дала довольно плохие результаты по сравнению с классом брошюровщиков, поэтому я 'Я предпочитаю использовать его, если это возможно.

Ответы на вопрос(1)

Ваш ответ на вопрос