Возможности отслеживания объекта после обнаружения (распознавание объектов на основе признаков)

Я работаю над распознаванием объектов в Android. Пока я могу обнаруживать/распознавать объекты с частотой кадров 5-8 кадров в секунду. Теперь я хочу отслеживать обнаруженный объект в последующих кадрах.

краткое изложение того, что я сделал до сих пор.

  1. захватывать и сохранять интересующий объект во внешней директории телефона в виде изображения.
  2. Обнаружение и извлечение характерных точек (используется детектор характеристик ORB и дескриптор).
  3. Выполните сопоставление и нарисуйте прямоугольную рамку вокруг обнаруженного объекта (гомография).

Пример обнаруженного объекта. введите здесь описание изображения

Теперь, после выполнения гомографии, я намерен отслеживать объект на последующих кадрах. Какие возможные алгоритмы могут это сделать (возможен ли этот метод отслеживания после обнаружения)? Я прошел через фильтр частиц и отслеживание на основе фильтра Калмана, но не смог понять, какие параметры необходимо передать для создания экземпляра отслеживания после гомографии. Любая ссылка на алгоритмы отслеживания, документы, примеры кода в openCV будет полезна.

ИЗМЕНИТЬ

for(int i_gm=0; i_gm<goodmatches.size(); i_gm++)
        {

            scene.push_back(v1[goodmatches[i_gm].trainIdx].pt);
            objnew.x+=scene[i_gm].x;
            objnew.y+=scene[i_gm].y;
        }
   // calculation of centroid of the object.
      objnew.x/=scene.size();
      objnew.y/=scene.size();

   // Kalman predict and correct.
        KfMeasurement.setTo(Scalar(0));
        Kf.statePre.at<float>(0)=objnew.x;
        Kf.statePre.at<float>(1)=objnew.y;
        Kf.statePre.at<float>(2)=0;
        Kf.statePre.at<float>(3)=0;
        Kf.transitionMatrix=(Mat_<float>(4,4)<< 1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1);
        setIdentity(Kf.measurementMatrix);
        setIdentity(Kf.processNoiseCov,Scalar::all(1e-5));
        setIdentity(Kf.measurementNoiseCov,Scalar::all(1e-1));
        setIdentity(Kf.errorCovPost,Scalar::all(.1));
        Mat prediction = Kf.predict();
        Point predictPt(prediction.at<float>(0),prediction.at<float>(1));
        KfMeasurement(0)=objnew.x;
        KfMeasurement(1)=objnew.y;
        Point measPt(KfMeasurement(0),KfMeasurement(1));
        Mat estimated=Kf.correct(KfMeasurement);
        Point statept(estimated.at<float>(0),estimated.at<float>(1));
        circle( kalRgba,statept,50, Scalar(255,255,255), 3 );
        circle(kalRgba, measPt, 10,Scalar(10,10,255), 3 );
        circle( kalRgba,predictPt,10, Scalar(100,255,0), 3 );

person Darshan    schedule 21.01.2014    source источник
comment
как правило, алгоритмы оптического потока используются для визуального отслеживания. если вы хотите использовать свое собственное обнаружение в качестве шага измерения, вы можете использовать фильтр Калмана с априорной информацией = текущий центр прямоугольника, информация об измерении = следующий центр прямоугольника. проверьте оба: stackoverflow.com/questions/17520711/, epubs.surrey.ac.uk/713800/1/Kalal-PAMI-2011(1).pdf   -  person baci    schedule 21.01.2014
comment
Спасибо @CanberkBaci. Я попробую ваше предложение и опубликую полученные результаты.   -  person Darshan    schedule 21.01.2014
comment
Вы всегда можете применить простое отслеживание к углам ограничивающей рамки и центроиду.   -  person GilLevi    schedule 23.01.2014
comment
@GilLevi Не могли бы вы объяснить, что вы подразумеваете под простым отслеживанием (конкретный алгоритм или какие-либо документы)? Я внедрил фильтр Калмана, но это не было большой оптимизацией для увеличения частоты кадров, так как мне пришлось снова инициировать процесс обнаружения, чтобы получить новые точки объекта при его перемещении, а затем передать новые точки фильтру Калмана. Я сейчас смотрю на код openTLD, он кажется интересным, но и немного сложным. Любая помощь будет высоко оценена. Спасибо.   -  person Darshan    schedule 29.01.2014
comment
@Darshan, извините за поздний ответ. Не могли бы вы объяснить, в чем проблема с фильтром Калмана, я не следил.   -  person GilLevi    schedule 03.02.2014
comment
@GilLevi: я обновил свой вопрос кодом, он может быть полезен для вас, чтобы понять мою проблему. Проблема в том, что для получения обновленных точек objnew.x и objnew.y в каждом кадре мне приходится повторно инициализировать процесс распознавания, что не способствует увеличению частоты кадров. Есть ли другой способ сделать это? Моя реализация неверна? пожалуйста, направьте меня в правильном направлении.   -  person Darshan    schedule 03.02.2014
comment
@Darshan, еще раз извините за поздний ответ. Вы можете предсказать местоположение объекта в следующем кадре, а затем, в следующем кадре, искать объект в некоторой области вокруг предсказанного местоположения. Это помогает?   -  person GilLevi    schedule 06.02.2014
comment
искать объект в каком-то районе вокруг предсказанного местоположения, как это сделать? определить область интереса и выполнить поиск в этом месте или, возможно, использовать метод поиска окна в последующих кадрах? Спасибо за помощь . Я начал интегрировать TLD в свое приложение, но все же хотел бы опробовать ваши предложения по фильтрам Каламана.   -  person Darshan    schedule 07.02.2014