Пространственно-временная фильтрация (регрессионный анализ) в OpenCV
Появился такой вопрос, в который я сходу не могу въехать, но может кто-нибудь тут знает. Появилась необходимость быстро реализовать регрессионный анализ видеопотока для выделения в нём движущихся относительно фона объектов. Сам фон — нестационарный, но постоянный: камера брыкается туда-сюда с шагом порядка десятка пикселей. В принципе эта задача практически идеально решается, если есть процедура регрессионного анализа. Но под рукой на том языке на котором я пишу её нет. Писать с нуля — влом, она большая. Хочется решить через OpenCV. Функции оптического потока(LK) не подходят — они, к сожалению, имеют низкую точность, слишком много высоких шумов после вычитания. Функции из разряда «UpdateMotionHistory» не подходят тем более — там стационарный фон.
Неужели в OpenCV нет функции, которая вычитает два изображения друг из друга ища оптимальный сдвиг и поворот, максимизируя корреляцию?? Или я неправильно использую что-то из вышеперечисленного?
Ну как-бы Лукас-Канаде делает именно то, что Вы описали, ищет корреляцию в окне для нескольких хороших точек. Посмотрите еще раз в сторону оптического потока, для этой задачи он должен дать весьма хорошую точность. Возможно Вы когда экспериментировали с ним, выбрали точки неудачно или параметры. Как найдете движение всех точек, можно попробовать найти движение, которое соответствует фону.
Ну это не чистый Лукас-Канаде, а модифицированный(PyrLK). Я с ним дольше всего пробовал разные вариации делать. Где-то на половине кадров он почти полностью всё совмещает, но, к сожалению, на остальной половине всё безрадостно, там на резких границах ошибка порядка пикселя набегает, что приводит к ужасным результатам. Вообще, хорошие методы регрессии (у меня есть есть набор библиотек на дельфи), используют порядка 5 кадров истории и хорошие результаты дают из-за этого, как я понимаю. А методы оптического потока OpenCV используют лишь два-два с половиной кадра…
Вам тогда наверное не ЛК нужен, а немного другой… вот вчера не мог вспомнить название и сейчас не могу вспомнить к сожалению (если вспомню, напишу, вроде два китайца его делали, по их именам и назван)… там он все пиксели обрабатывает на изображении, а не только фичи. Но насколько я помню. в ОпенСВ его нет реализованного, хотя могу и ошибаться. А про пирамидальный ЛК в ОпенСВ то правда, вроде все к нему пришли как к лучшему из реализаций.
Если вам еще актуально, замечу, что в OpenCV есть функции для выделения фона , которые как раз приспособлены для тез случаев, когда он переодическ меняется.