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

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

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

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

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

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

4b9b3361

Ответ 1

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

  • в кадре 1 обнаруживают N функций, это Keyframe m = 1
  • в кадре k отслеживает функции оптическим потоком
  • в кадре k, если число успешно отслеживаемых объектов падает ниже N/2:
    • этот кадр ключевой кадр m + 1
    • вычислить гомографию или фундаментальную матрицу, описывающую движение между ключевыми кадрами m и m + 1
    • обнаруживает функции N и отбрасывает старые
    • k: = k + 1 перейти к 2

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

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

Ответ 2

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

Ответ 3

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

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

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