1

我正在研究android中的对象识别。到目前为止,我能够以 5-8 fps 的帧速率检测/识别物体。现在,我想在后续帧中跟踪检测到的对象。

到目前为止我所做的工作的简短摘要。

  1. 捕获感兴趣的对象并将其作为图像存储在电话的外部目录中。
  2. 检测并提取特征点(使用 ORB 特征检测器和描述符)。
  3. 执行匹配并在检测到的对象周围绘制矩形框(Homography)。

检测到的对象的示例。 在此处输入图像描述

现在,在执行单应性之后,我打算在后续帧中跟踪对象。哪些可能的算法可以做到这一点(这种检测后跟踪的方法是否可行)?。我已经完成了基于粒子滤波器和卡尔曼滤波器的跟踪,但无法理解需要传递哪些参数来实例化单应性跟踪。任何对 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 );
4

0 回答 0