2013-06-13 2 views
0

Я работаю над стабилизатором видео используя Opencv в C++.
В это время проекта я правильно смогу найти перевод между двумя последовательными кадрами с помощью трех разных методов (оптический поток, фазовая корреляция, BFMatcher по точкам интересов).
Для получения стабилизированного изображения я добавляю весь вектор трансляции (из последовательного кадра) в один, который используется в функции warpAffine для коррекции выходного изображения.Opencv - Как отличить дрожание от панорамирования?

У меня хороший результат на неподвижной камере, но результат в переводе на камеру очень плохой: изображение исчезает с экрана.

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

ответ

0

Я хотел бы предложить вам возможные подходы (в порядке сложности):

  • применять некоторые простые в реализации БИХ-фильтр нижних частот на векторы трансляции перед применением стабилизации. Это отделит высокочастотную (дрожание) от низкой частоты (панорамирование)
  • та же идея, немного сложнее, использует фильтрацию Калмана для отслеживания движения с постоянной скоростью или ускорением. Для этого вы можете использовать фильтр Kalman от OpenCV.
  • Чуть более сложный, установите порог амплитуды движения, чтобы выбрать между двумя состояниями (перемещение против статической камеры) и фильтровать перевод или нет.
  • Окончательный вариант: вы можете использовать технику из машины Learning, чтобы попытаться определить желаемое движение пользователя (статическое, панорамирование и т. Д.) И фильтровать или не использовать векторы движения, используемые для стабилизации.

Только порог не является фильтром нижних частот. Возможные фильтры нижних частот (которые легко осуществить):

  • существует хорошо известно усреднение, то есть уже фильтр низких частот отсечки которого частота зависит от количества образцов, которые идут в уравнение усреднения (чем больше образцов, тем ниже частота среза).
  • Одним часто используемым фильтром является экспоненциальный фильтр (поскольку он забывает прошлое с экспоненциальным расходом). Он просто вычисляется как x_filt(k) = a*x_nofilt(k) + (1-a)x_filt(k-1) с 0 <= a <= 1.
  • Другим популярным фильтром (и который может быть вычислен за пределы 1) является Butterworth filter.
  • Etc Low pass filters on Wikipedia, IIR filters ...
+0

Благодарим за быстрый ответ. Можете ли вы рассказать мне больше о первом подходе? Простой '' 'достаточно, чтобы сделать фильтр нижних частот? Вот что я пробовал. –

+0

В принципе, нет. Пожалуйста, взгляните на отредактированный ответ. – sansuiso

1

На самом деле вся проблема является немного более сложным, чем вы могли бы подумать, в самом начале. Давайте посмотрим так: когда вы перемещаете камеру по всему миру, все, что движется близко к камере, движется быстрее, чем те, что находятся в фоновом режиме, - поэтому объекты на разных глубинах меняют свое относительное расстояние (посмотрите на свой искатель, перемещая голову и посмотреть, как это указывает на разные вещи). Это означает, что изображение фактически трансформируется и не только переводит (перемещается по x или y) - так как вы хотите сопутствовать этому? Что вам нужно сделать, так это сделать вывод о том, насколько перемещена камера (перевод по х, y и z) и насколько она вращается (с углами рыскания, панорамирования и наклона).Это не очень простая задача, но OpenCV приходит с очень хорошим пакетом: http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html

Так что я рекомендую вам прочитать больше на гомография (http://en.wikipedia.org/wiki/Homography), модель камеры и калибровки, как это возможно, а затем думать, что вы на самом деле хотите, чтобы стабилизировать для и, если это только для углов поворота, задача намного проще, чем если бы вы также хотели бы стабилизировать трансляционные колебания.

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

Смежные вопросы