Подтвердить что ты не робот

Стабилизация видео с помощью OpenCV

У меня есть видеопоток, который берется с движущейся камерой и содержит движущиеся объекты. Я бы хотел стабилизировать видео, чтобы все неподвижные объекты оставались неподвижными в видеопотоке. Как это сделать с помощью OpenCV?

то есть. Например, если у меня есть два изображения prev_frame и next_frame, как преобразовать next_frame, чтобы видеокамера выглядела неподвижной?

4b9b3361

Ответ 1

Я могу предложить одно из следующих решений:

  • Использование локальных высокоуровневых функций: OpenCV включает SURF, поэтому: для каждого кадра извлекайте функции SURF. Затем создайте функцию Kd-Tree (также в OpenCV), затем сопоставьте каждый два последовательных кадра, чтобы найти пары соответствующих функций. Поместите эти пары в cvFindHomography, чтобы вычислить гомографию между этими кадрами. Деформация кадров в соответствии с (объединенными..) гомологиями для стабилизации. Это, насколько мне известно, очень надежный и сложный подход, однако извлечение и сопоставление SURF может быть довольно медленным.
  • Вы можете попытаться сделать это с помощью "менее надежных" функций, если вы ожидаете незначительного перемещения между двумя кадрами, например. используйте угловое определение Harris и создайте пары углов, наиболее близкие друг к другу в обоих кадрах, затем подайте в cvFindHomography, как указано выше. Вероятно, быстрее, но менее надежным.
  • Если вы ограничиваете перемещение для перевода, вы можете заменить cvFindHomography на что-то большее... простое, просто получить перевод между парами функций (например, средний)
  • Используйте фазовую корреляцию (ссылка http://en.wikipedia.org/wiki/Phase_correlation), если вы ожидаете только перевода между двумя кадрами. OpenCV включает в себя DFT/FFT и IFFT, см. Связанную статью в википедии о формулах и пояснениях.

ИЗМЕНИТЬ Три замечания, которые я должен упомянуть прямо, на всякий случай:

  • Подход, основанный на гомографии, может быть очень точным, поэтому стационарный объект останется неподвижным. Тем не менее, гомографии включают в себя перспективные искажения и масштабирование, поэтому результат может выглядеть немного... необычным (или даже искаженным для некоторых быстрых движений). Хотя это точно, это может быть менее визуально приятным; поэтому используйте это скорее для дальнейшей обработки или, например, для судебной экспертизы. Но вы должны попробовать, может быть супер-приятным для некоторых сцен/движений.
  • Насколько я знаю, по крайней мере несколько бесплатных инструментов для стабилизации видео используют фазовую корреляцию. Если вы просто хотите "не встряхнуть" камеру, это может быть предпочтительнее.
  • В этой области идет довольно много исследований. В некоторых статьях вы найдете несколько более сложных подходов (хотя они, вероятно, требуют больше, чем просто OpenCV).

Ответ 2

OpenCV имеет функции valuRigidTransform() и warpAffine(), которые отлично справляются с этой проблемой.

Его в значительной степени просто:

Mat M = estimateRigidTransform(frame1,frame2,0)
warpAffine(frame2,output,M,Size(640,480),INTER_NEAREST|WARP_INVERSE_MAP) 

Теперь output содержит содержимое frame2, которое лучше всего выровнено, чтобы соответствовать frame1. Для больших сдвигов M будет представлять собой нулевую матрицу, или она может быть не матрицей вообще, в зависимости от версии OpenCV, поэтому вам придется отфильтровывать те и не применять их. Я не уверен, насколько это велико. возможно, половина ширины рамки, возможно, больше.

Третий параметр для оценкиRigidTransform - это логическое выражение, которое сообщает ему, следует ли применять произвольную аффинную матрицу или ограничивать ее преобразованием/вращением/масштабированием. В целях стабилизации изображения с камеры вы, вероятно, просто хотите последнего. Фактически, для стабилизации изображения камеры вы также можете удалить любое масштабирование из возвращаемой матрицы, нормализуя ее только для вращения и перевода.

Кроме того, для движущейся камеры вы, вероятно, захотите пробовать M по времени и вычислить среднее значение.

Вот ссылки на дополнительную информацию о оценкаRigidTransform() и warpAffine()

Ответ 4

Я прошел мимо своего ответа от этого. Как стабилизировать видео в веб-камерах?


Вчера я только что сделал несколько работ (в Python) по этому вопросу, основные шаги:

  • используйте cv2.goodFeaturesToTrack, чтобы найти хорошие углы.
  • используйте cv2.calcOpticalFlowPyrLK для отслеживания углов.
  • используйте cv2.findHomography для вычисления матрицы гомографии.
  • используйте cv2.warpPerspective, чтобы преобразовать видеокадр.

Но результат теперь не тот, что я могу выбрать SIFT keypoints, кроме goodFeatures.


Источник:

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

Стабилизировать автомобиль:

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

Ответ 5

Это сложная проблема, но я могу предложить несколько более простой ситуации.

  1. Сдвиг/поворот next_frame на произвольную величину
  2. Используйте threshold(abs(prev_frame-next_frame_rotated)) вычитания фона threshold(abs(prev_frame-next_frame_rotated)) чтобы найти статические элементы. Вам придется поиграться с тем, какое пороговое значение использовать.
  3. Найти min(template_match(prev_frame_background, next_frame_rotated_background))
  4. Запишите смещение/вращение ближайшего совпадения и примените его к next_frame

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

Ответ 6

Я должен добавить следующие замечания для завершения zerm answer. Это упростит вашу проблему, если будет выбран один стационарный объект, а затем работать с zerm подход (1) с этим единственным объектом. Если вы обнаружите неподвижный объект и примените исправление к нему, я думаю, что безопасно предположить, что другие стационарные объекты также будут выглядеть стабильными.

Хотя это, безусловно, справедливо для вашей жесткой проблемы, у вас будут следующие проблемы с этим подходом:

  • Обнаружение и оценка гомографии иногда терпят неудачу по различным причинам: окклюзии, внезапные движения, размытость движения, серьезные различия в освещении. Вам придется искать способы справиться с этим.

  • У вашего целевого объекта (ов) могут быть окклюзии, что означает, что его обнаружение завершится неудачно в этом фрейме, и вам придется обрабатывать окклюзии, что само по себе является цельной темой исследования.

  • В зависимости от вашего оборудования и сложности вашего решения у вас могут возникнуть проблемы с получением результатов в режиме реального времени с использованием SURF. Вы можете попробовать реализовать opencv gpu или другие более быстрые детекторы функций, такие как ORB, BRIEF или FREAK.

Ответ 7

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

  • Сначала вы должны извлечь функцию из изображения с помощью экстрактора функций, такого как SIFT, алгоритм SURF. В моем случае лучше всего использовать алгоритм FAST + ORB. Если вам нужна дополнительная информация, См. Эту статью
  • После того, как вы получите функции в изображениях, вы должны найти соответствующие функции с изображениями. Существует несколько совпадений, но Bruteforce matcher неплох. Если Bruteforce медленнее в вашей системе, вы должны использовать такой алгоритм, как KD-Tree.
  • Наконец, вы должны получить матрицу геометрических преобразований, которая минимизирует ошибку преобразованных точек. Вы можете использовать алгоритм RANSAC в этом процессе. Вы можете разработать весь этот процесс с помощью OpenCV, и я уже разработал его на мобильных устройствах. См. этот репозиторий

Ответ 8

Справочная информация: я работал над этим исследовательским проектом, в котором я пытался подсчитать, сколько времени потребуется человеку, стоящему в очереди, чтобы добраться до стойки. Первым, что мне потребовалось, была ОБУВЬ, поэтому я пошел в кампус и записал какого-то туриста, который двигался в очереди, чтобы получить билеты. До этого момента я понятия не имел, как рассчитать время ожидания в очереди и какие меры предосторожности следует предпринять при записи отснятого материала. В конце дня я обнаружил, что все записи, которые я записал, были записаны шаткой камерой. Поэтому в этот момент мне сначала нужно было стабилизировать видео, а затем только разработать другое решение для расчета времени в очереди.

Стабилизация видео с использованием шаблона соответствия

  • Найдите статические объекты, такие как опрос, дверь или что-то, что, как вы знаете, не должно двигаться
  • Используйте сопоставление с шаблоном для расчета смещения изменения местоположения статического объекта (относительно границ кадра) в каждом последующем кадре.
  • Преобразуйте каждый кадр со значением смещения, например, пусть tx и ty.

Кадры результата:

Gif, чтобы показать результат этой техники