Я использую opencv c ++ и я новый пользователь. Меня интересуют проблемы с обнаружением объектов. До сих пор я изучал и реализовал использование разреженного оптического потока (метод Лукаса Канаде) в видео со стационарной камеры. Попробовав k средних и вычитание фона, я решил перейти к более сложной проблеме — движущейся камере. ,
До сих пор я изучил некоторую документацию и обнаружил, что могу использовать cv :: findHomography для того, чтобы находить внутренние или внешние значения во время последовательности кадров в моем видео, а затем понимать из возвращаемых значений, какое движение вызвано движением камеры и что связано с движением объекта. Кроме того, я мог бы использовать функции SURF для отслеживания некоторых объектов, а затем решить, какие из них являются хорошими.
Однако мне было интересно, как я могу реализовать эту теорию. Например, должен ли я использовать первый кадр как основную правду и обнаруживать некоторые функции, используя SURF, а затем для остальной части видео использовать findHomography для каждого кадра? Любые идеи / помощь приветствуется!
Обнаружение движущихся объектов с помощью движущейся камеры является довольно сложной задачей и требует глубокого понимания геометрии нескольких видов, кроме того, по этой теме доступно меньше информации (чем, например, о структуре из движения), так что будьте осторожны!
В любом случае, гомографическая матрица не будет хорошим выбором для обнаружения движущихся объектов (если вы не уверены на 100%, что ваш фон может быть достаточно точно представлен плоской поверхностью). Вы, вероятно, должны использовать фундаментальную матрицу или трифокальный тензор.
Фундаментальная матрица вычисляется из точечных соответствий между 2 кадрами. Он связывает точки на одном изображении с линиями на другом изображении (так называемые эпиполярные линии) и таким образом не зависит от структуры сцены. После того, как вы получили F-матрицу, используя надежный метод оценки, например RANSAC или же LMEDS (RANSAC кажется лучше для такого рода задач), вы можете рассчитать ошибку перепроецирования для каждой точки. Объекты, которые перемещаются независимо от сцены, не будут точно описываться F-матрицей и будут иметь большую ошибку. Таким образом, выбросы F-матрицы, рассчитанные по совпадениям изображений в двух кадрах, можно считать движущимися объектами. Одно замечание — объекты, которые движутся вдоль эпиполярных линий, не будут обнаружены этим подходом, поскольку их параллакс также может быть описан некоторым уровнем глубины.
Трифокальный тензор не имеет неоднозначности глубины / движения с объектами, которые движутся вдоль эпиполярных линий, но это труднее оценить, и это не входит в OpenCV. Он может быть рассчитан из соответствий более 3 кадров, и его использование может быть концептуально описано как триангуляция точки из 2 представлений, а затем вычисление ошибки перепроецирования в третьем представлении.
Что касается соответствия — я все еще думаю, что LK отслеживание будет лучше, чем сопоставление SURF, если вы работаете с видеопоследовательностями, поскольку в этом случае вам не нужно рассматривать очень отдаленные точки как совпадения, и отслеживание обычно происходит быстрее, чем обнаружение + сопоставление.
Других решений пока нет …