Я работаю над распознаванием объектов в Android. Пока я могу обнаруживать/распознавать объекты с частотой кадров 5-8 кадров в секунду. Теперь я хочу отслеживать обнаруженный объект в последующих кадрах.
краткое изложение того, что я сделал до сих пор.
- захватывать и сохранять интересующий объект во внешней директории телефона в виде изображения.
- Обнаружение и извлечение характерных точек (используется детектор характеристик ORB и дескриптор).
- Выполните сопоставление и нарисуйте прямоугольную рамку вокруг обнаруженного объекта (гомография).
Пример обнаруженного объекта.
Теперь, после выполнения гомографии, я намерен отслеживать объект на последующих кадрах. Какие возможные алгоритмы могут это сделать (возможен ли этот метод отслеживания после обнаружения)? Я прошел через фильтр частиц и отслеживание на основе фильтра Калмана, но не смог понять, какие параметры необходимо передать для создания экземпляра отслеживания после гомографии. Любая ссылка на алгоритмы отслеживания, документы, примеры кода в 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 );