Отслеживание в видеопоследовательности с определенной пользователем целью для отслеживания

У меня есть проект по созданию приложения, в котором пользователь может рисовать интересующую область (в этом примере прямоугольник вокруг транспортного средства для отслеживания), и оно будет автоматически отслеживать транспортное средство в последующих кадрах записанного видео.

Метод, который я реализовал до сих пор с использованием OpenCV, выглядит следующим образом:

(1) Получите определенный пользователем прямоугольник (область интереса) изinitial_frame введите описание изображения здесь

(2) ИспользуйтеgoodFeaturesToTrackна интересующей области и сохранитеinitial_features введите здесь описание изображения

(3) Перейдите к следующим кадрам в видео 3.1: Получите next_frame 3.2: Вызовите calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts,...) *где prevImg всегда initial_frame, а prevPts всегда initial_featues , и каждый раз я обновляю только nextImg следующим кадром видео 3. 3: Получить ограничивающий прямоугольник для недавно найденных функций из nextPts 3.4: Отобразить рамку с ограничивающим прямоугольником введите описание изображения здесь

Этот метод работает в большинстве из 50 последовательных кадров, за исключением нескольких случаев, когда отслеживание приводит к чему-то вроде этого:

введите здесь описание изображения

но после 50 кадров результаты становятся все менее и менее точными:

введите здесь описание изображения

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

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

*Примечание. Эту функцию я использую для получения ограничивающего прямоугольника массива признаков, возвращаемых из оптического потока (здесь я использую EMGUCV):

    public Rectangle RectFromPoints(List<PointF> points)
    {
        using (MemStorage stor = new MemStorage())
        {
            Contour<PointF> contour = new Contour<PointF>(stor);

           // Remove points far outside the major grouping of all the other points
            var newPoints = RemoveOutlierPoints(points); 

            foreach(PointF pnt in newPoints)
            {
                contour.Push(pnt);
            }
            var contPoly = contour.ApproxPoly(3, stor);

            var rect = contPoly.BoundingRectangle;
            return rect;
        }
    }

person salgarcia    schedule 29.04.2014    source источник
comment
вы можете обновить свой список функций, чтобы отслеживать от кадра к кадру, но это еще больше ухудшит вырождение, если вы не можете быть уверены, что ваше отслеживание было успешным. Я бы предложил фильтр частиц, как в perso.telecom-paristech. fr/~bloch/P6Image/articles/ или показано на странице youtube.com/watch? v=O1FZyWz_yj4   -  person Micka    schedule 30.04.2014
comment
Еще одно предложение: никогда не используйте оптический поток на движущейся камере! Это сделано для приложений, когда камера неподвижна, а объект движется.   -  person Khawar Ali    schedule 30.04.2014
comment
@KhawarAli Интересно ... у вас есть какие-либо предложения по использованию, когда и объект для отслеживания, и камера движутся?   -  person salgarcia    schedule 05.05.2014
comment
вы проверили OpenTLD?   -  person ivan_a    schedule 17.10.2014


Ответы (3)


Попробуйте использовать трекер корреляции. Современные довольно хороши, например: https://www.youtube.com/watch?v=-8-KCoOFfqs. Вы также можете получить код для этого в dlib.

person Davis King    schedule 01.03.2015

В OpenCV 3.0 contrib есть несколько доступных трекеров (TLD, MEDIANFLOW, BOOSTING и MIL). Вы также можете найти пример CPP. Сравнение производительности современных трекеров доступно на странице VOTchallenge.

person eyebies    schedule 29.12.2015

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

person tektok tek    schedule 25.01.2016