Стабилизация видео с помощью OpenCV
У меня есть видеопоток, который берется с движущейся камерой и содержит движущиеся объекты. Я бы хотел стабилизировать видео, чтобы все неподвижные объекты оставались неподвижными в видеопотоке. Как это сделать с помощью OpenCV?
то есть. Например, если у меня есть два изображения prev_frame и next_frame, как преобразовать next_frame, чтобы видеокамера выглядела неподвижной?
Ответы
Ответ 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()
Ответ 3
openCV теперь имеет класс стабилизации видео: http://docs.opencv.org/trunk/d5/d50/group__videostab.html
Ответ 4
Я прошел мимо своего ответа от этого. Как стабилизировать видео в веб-камерах?
Вчера я только что сделал несколько работ (в Python
) по этому вопросу, основные шаги:
- используйте
cv2.goodFeaturesToTrack
, чтобы найти хорошие углы.
- используйте
cv2.calcOpticalFlowPyrLK
для отслеживания углов.
- используйте
cv2.findHomography
для вычисления матрицы гомографии.
- используйте
cv2.warpPerspective
, чтобы преобразовать видеокадр.
Но результат теперь не тот, что я могу выбрать SIFT keypoints
, кроме goodFeatures
.
Источник:
![введите описание изображения здесь]()
Стабилизировать автомобиль:
![введите описание изображения здесь]()
Ответ 5
Это сложная проблема, но я могу предложить несколько более простой ситуации.
- Сдвиг/поворот
next_frame
на произвольную величину - Используйте
threshold(abs(prev_frame-next_frame_rotated))
вычитания фона threshold(abs(prev_frame-next_frame_rotated))
чтобы найти статические элементы. Вам придется поиграться с тем, какое пороговое значение использовать. - Найти
min(template_match(prev_frame_background, next_frame_rotated_background))
- Запишите смещение/вращение ближайшего совпадения и примените его к
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, чтобы показать результат этой техники