Вопрос по c++ – Отслеживание функций с использованием оптического потока

23

Я нашеланалогичный вопрос на форуме. Но ответ там не отвечает на мой вопрос.

If I do feature detection (goodFeaturesToTrack) only once on the first image, and then use optical flow (calcOpticalFlowPyrLK) to track these features, the problem is: only the features detected on the first image can be tracked. When these features go beyond of the image, there would be no features to track.

If I do feature detection for every new image, the feature tracking is not stable, because the feature detected last time may not be detected this time.

Я использую оптический поток для 3D-реконструкции. Поэтому я не заинтересован в том, чтобы отслеживать, какие функции, а меня интересует только то, можно ли отслеживать функции в поле зрения. Подвести итоги,my question is: как я могу использовать оптический поток для отслеживания старых функций, а тем временем добавить новые функции изображений, которые входят в поле зрения, и удалить старые функции, которые выходят за пределы поля зрения?

поскольку это не было упомянуто в этом старом вопросе, версия lkdemo на python делает немного больше, чем его аналог на c ++, проверьте, может решить эту проблему для некоторых:github.com/npinto/opencv/blob/master/samples/python/lkdemo.py Stefan Karlsson

Ваш Ответ

3   ответа
19

Возможны несколько подходов. Хороший метод выглядит так:

  1. in Frame 1 detect N features, this is the Keyframe m=1
  2. in Frame k track the features by optical flow
  3. in Frame k if the number of successfully tracked features drops under N/2:
    • this frame is the keyframe m+1
    • compute the homography or the fundamental matrix describing the motion between the keyframes m and m+1
    • detect N features and discard the old ones
    • k := k+1 go to 2

В этом методе в основном вы оцениваете движение камеры между двумя последними ключевыми кадрами.

Поскольку вы не упомянули, какой подход используется для трехмерной реконструкции, я предположил, что либоH или жеF вычисляются для оценки движения в первую очередь. Для их точной оценки базовая линия между ключевыми кадрами должна быть максимально широкой. В общем, лучшая стратегия - учесть грубую модель движения камеры. Если камера держится рукой, следует использовать другую стратегию по сравнению с тем, когда камера закреплена на верхней части автомобиля или робота. Я могу привести минимальный рабочий пример на Python, если это поможет, дайте мне знать.

Спасибо. Это кажется хорошим решением. Я работаю с C ++. Так что спасибо за щедрое предложение в любом случае. Shiyu
@fireant Спасибо за ответ. Я был бы рад, если бы вы могли привести мне пример с питоном?
@Clive, это почти на 2 года позже, но я надеюсь, что это кому-то поможет!Code Волшебство происходит в строках после комментария о возможностях обновления. Большая часть исходного кода совпадает с документацией OpenCV, которую можно прочитатьhere.
0

Есть еще один хороший способ добавить новые функции к уже существующим. Вы можете передать маску вcv::goodFeaturesToTrack(), Таким образом, вы бы создали новый коврик (такого же размера, как оригинальное изображение,type: CV_8UC1), установите для всех пикселей значение 255 и нарисуйте каждую характерную точку в виде черного круга в этом мате. Когда вы передаете эту маску вgoodFeaturesToTrack() эти черные круги будут пропущены функцией.

Я также рекомендовал бы ограничить количество функций. Допустим, вы ограничиваете егоMAX_FEATURES = 300, Затем вы проверяете каждый цикл, есть ли у вас меньше треков, чемMAX_FEATURES - z (e.g. z = 30), В этом случае найдите до z новых функций, как указано выше, и добавьте их в свой контейнер компонентов.

Также обратите внимание, что вы должны активно удалять функции, если отслеживание не удалось. Поэтому вам придется посмотреть на вывод состоянияcalcOpticalFlowPyrLK.

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

Просто для целей документирования существует несколько хороших реализаций отслеживания оптического потока на GPU / C ++. Ваш код может быть лучше для ваших целей, но если вам нужны только выходные данные треков, рассмотрите возможность проверки любого из следующих источников:Вот, Вот, или жеВот.

Похожие вопросы