使用calcOpticalFlowPyrLK跟踪多个对象

时间:2015-09-28 14:23:21

标签: c++ opencv video computer-vision

下面的代码片段用于跟踪,但问题是我不知道为什么由于某些原因点(对象的质心点)平行消失几帧,calcOpticalFlowPyrLK也不适用于那些帧,一切都消失了几帧。图像如下所示。任何人都可以帮助您持续跟踪这些对象。我也试过用kalman过滤器但是没能成功。

视频的第10帧

Frame 10 of the video

视频的第25帧

看看这个图像点只会在显示输入图像时消失

Frame 25 of the video

视频的第45帧

Frame 45 of the video

    for(int i =0; i<theVehicles.size(); i++){
    Point p=Point(theVehicles.at(i).getXPos(),theVehicles.at(i).getYPos());
    points12.push_back(p);
    TermCriteria termcrit(TermCriteria::COUNT|TermCriteria::EPS,20,0.03);
    Size subPixWinSize(10,10), winSize(31,31);

    //cout<<p;

   calcOpticalFlowPyrLK(prevGray, filledEdgesOut,  points12,points, status, err, winSize, 3, termcrit, 0, 0.001);

   RNG rng(12345);

            for( int i = 0; i < points.size(); i++ )
     { 
         circle( frame, points[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255),rng.uniform(0,255)), -1, 8, 0 ); 

         /*cv::circle(frame,points[i],10,cv::Scalar(0,0,255));
         cv::putText(frame,intToString(theVehicles.at(i).getXPos())+ " , " + intToString(theVehicles.at(i).getYPos()),cv::Point(theVehicles.at(i).getXPos(),theVehicles.at(i).getYPos()+20),1,1,Scalar(0,255,0));
    cv::putText(frame,theVehicles.at(i).getType(),cv::Point(theVehicles.at(i).getXPos(),theVehicles.at(i).getYPos()-30),1,2,theVehicles.at(i).getColour());*/
            }

    }

1 个答案:

答案 0 :(得分:0)

如果您在循环中执行此操作(例如,对于每个帧),则必须在检测到并正确跟踪对象后重新生成对象上的点。例如,如果您使用边界框来描述您的车辆,那么一旦您在两个连续帧之间匹配车辆,您必须通过使用良好功能或统一在新的上生成一组新的点检测到车辆。