Быстрый приблизительный оптический поток / смещение изображения

9

Мне нужно определить скорость панорамирования камеры (горизонтальной / вертикальной), чтобы предупредить оператора о замедлении.

Все изображение движется как блок, мне не нужно фактическое направление (хотя H или V было бы бонусом), и мне нужна только приблизительная величина - т.е. сработать, если между кадрами сдвигается больше чем «N» пикселей.

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

Решение Niave - выбрать RoI в центре, найти ребра, вычислить сходство между парами кадров, сместить один из кадров влево / вправо / вверх / вниз на пиксель, повторить - найти минимумы.

Я задавался вопросом, было ли более разумное решение?

Мартин Беккет
источник

Ответы:

3

Вероятно, если вы ищете простой метод, он должен применять стандартные алгоритмы оценки движения, которые очень развиты в MPEG-классе кодеков сжатия. Их легко понять, и я думаю, вы получите много готовых кодов. Этот алгоритм генерирует вектор движения от блока к блоку, а затем вы можете найти наиболее заметный кластер и взять среднее направление и величину вектора движения.

MPEG4 - имеет еще одну ключевую концепцию под названием « Глобальная компенсация движения », метод, который делает попытки сначала оценить и компенсировать движение камеры и панорамирование. Прелесть в том, что такие методы могут быть простыми или исчерпывающими в зависимости от сложности. Вот один пример бумаги и другой документ для того же.

В общем, панорамирование камеры и оценка движения - это вполне устоявшаяся область исследований. вот ссылка: бумага и другая бумага .

На эту тему. Вы найдете как строгий и точный алгоритм, так и простые и быстрые.

Дипан Мехта
источник
Если бы я мог удобно подключиться к библиотеке MPEG, это было бы хорошо, я помню, что у GMC в Mpeg была критика. Я думал, что это будет общая область из-за алгоритмов стабилизации камеры
Мартин Беккет
Вы определенно можете подключить (или, скорее, извлечь) алгоритмы MPEG. Вы можете использовать FFMPEG в качестве библиотеки и извлечь ее, но это может быть сложно. Кроме того, вы можете прочитать аккуратный код MSSG для извлечения.
Дипан Мехта
Что касается критики в отношении GMC - это больше, чем обещание резко снизить скорость передачи данных и создать объектно- ориентированное кодирование. Однако оценить параметры движения камеры не так уж сложно.
Дипан Мехта
спасибо, я посмотрю на MSSG. Я использую ffmpeg, но это не простая библиотека, из которой можно просто извлечь что-то!
Мартин Беккет
3

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

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

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

эндолиты
источник
Спасибо, легко предположить, что БПФ медленный, но я могу сделать небольшое окно 2 ^ n. пс. Просто для поиска stackoverflow.com/questions/1100100/…
Мартин Беккет
3

Один из способов оценить скорость и направление - сделать «локальную» оценку потока, например, из четырех окон в центре изображения. Дифференциальный метод Лукаса – Канаде предполагает, что смещение является приблизительно постоянным, и поэтому его можно решить как уравнение.

Так что мое пошаговое руководство будет:

  1. Получить окно пикселей в центре изображения, например, 20x20
  2. Рассчитайте градиенты Ix и Iy.
  3. Разделите окно градиента на четыре части, например 4x10x10.
  4. Решите четыре линейных уравнения наименьших квадратов со следующим кадром.
  5. Усредните четыре вектора скорости.

Это определяет направление и скорость, однако вы можете использовать взвешенное окно, чтобы сделать его более устойчивым. Посмотрите на метод Лукаса-Канаде для его расширений.

Aagaard
источник
0

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

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