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