Идентификация движущихся объектов с помощью оптического потока

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

Пока я работаю с OpenCV и получаю разреженный оптический поток от PyrLKOpticalFlow. Общая идея, над которой я работал, заключалась в том, чтобы найти объекты, которые двигались не так, как фоновые точки на изображении, а затем найти группы этих по-разному движущихся объектов, чтобы считать их движущимися объектами для дальнейшего отслеживания/обработки. Моя проблема в том, что, хотя я нашел несколько академических работ, в которых использовалась подобная стратегия, до сих пор я не смог найти простой способ реализовать ее для себя.

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


person Ryan Clingman    schedule 14.11.2014    source источник


Ответы (2)


Мне удалось найти метод, который более или менее делает то, что я хочу в OpenCV.

После обнаружения разреженных точек оптического потока между двумя последовательными изображениями с помощью GoodFeaturesToTrackDetector и PyrLKOpticalFlow (что дает мне prevPts и nextPts), я использую findHomography с RANSAC для оценки движения из-за движения камеры, исключая выбросы из-за независимо движущихся объектов. Затем я использовал перспективуTransform, чтобы деформировать prevPts для учета движения камеры (что дало мне warpedPts). Затем я могу сравнить warpedPts со nextPts, чтобы найти движущиеся объекты.

Конечным результатом является то, что даже при перемещении камеры разница между точками в warpedPts и nextPts невелика, если объект неподвижен, в то время как есть значительное изменение, когда отслеживаемые точки находятся на движущемся объекте. Отсюда остается только сгруппировать движущиеся точки на основе близости и сходства движения.

person Ryan Clingman    schedule 17.12.2014

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

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

person baci    schedule 15.11.2014
comment
Моя проблема в том, что для этого приложения нам нужно, чтобы все работало как можно ближе к реальному времени (15 кадров в секунду для используемых нами камер). Хотя использование плотного оптического потока было бы неплохо, между этой и другой обработкой, которую мне нужно запускать для каждого кадра, просто не хватает времени, даже когда я выполняю большую часть обработки на графическом процессоре. - person Ryan Clingman; 17.11.2014
comment
поэтому вам нужно пойти на метод LK, выбор пикселей по сетке и примерно найти движущиеся части. как насчет динамического вычитания фона? я не уверен, реализовано ли это в opencv, хотя - person baci; 18.11.2014
comment
при чем здесь динамическое вычитание фона? - person Eyshika; 29.03.2021