Стабилизация видео с помощью OpenCV - PullRequest
36 голосов
/ 07 августа 2010

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

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

Ответы [ 7 ]

39 голосов
/ 18 августа 2010

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

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

EDIT Три замечания, которые я должен лучше упомянуть, на всякий случай:

  1. Гомографический подход, вероятно, очень точен, поэтому стационарный объект останется стационарным. Тем не менее, гомографии включают искажение перспективы и масштабирование, так что результат может выглядеть немного .. необычным (или даже искаженным для некоторых быстрых движений). Хотя точный, это могло бы быть менее визуально приятным; так что используйте это скорее для дальнейшей обработки или, например, для судебной экспертизы. Но вы должны попробовать это, это может быть очень приятно для некоторых сцен / движений.
  2. Насколько мне известно, по крайней мере несколько бесплатных инструментов для стабилизации видео используют фазовую корреляцию. Если вы просто хотите «раскачать» камеру, это может быть предпочтительнее.
  3. В этой области ведутся довольно серьезные исследования. В некоторых статьях вы найдете гораздо более сложные подходы (хотя они, вероятно, требуют большего, чем просто OpenCV).
15 голосов
/ 23 июля 2013

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 во времени и вычислить среднее значение.

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

13 голосов
/ 14 сентября 2013

openCV теперь имеет класс стабилизации видео: http://docs.opencv.org/trunk/d5/d50/group__videostab.html

4 голосов
/ 25 ноября 2017

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


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

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

Но результат сейчас не такой идеальный, может быть, я должен выбрать SIFT keypoints, отличный от goodFeatures.


Источник:

enter image description here

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

enter image description here

3 голосов
/ 19 октября 2015

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

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

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

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

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

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

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

3 голосов
/ 07 августа 2010

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

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

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

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