2014-12-28 4 views
0

Привет, я прошел через несколько ресурсов (например, opencv-сайт, примеры кода opencv и т. Д.) И написал код C++ для отслеживания пути движущегося объекта (здесь он является человеком) со статической камеры. Вот мой кодНет хороших результатов из моего кода оптического потока opencv

int main(int argc, char *argv[]) 
{ 

    int MAX_COUNT=100; 
    Size SubPixelWinSize(10,10),winSize(30,30); 
    TermCriteria termcrit(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,30,0.01); 

    Mat frame_old; 
    Mat gray_old; 
    vector<Point2f>points; 
    vector<Point2f>pointsnew; 
    vector<uchar>status; 
    vector<float>err; 

    VideoCapture capture("C:\\Users\\Usre\\Desktop\\free\\1.mp4"); 
    capture.set(CV_CAP_PROP_POS_MSEC,1000); 

    if(!capture.isOpened()) 
    {cout<<"error opening video"<<endl;return -1;} 

    else 
    { 

     capture>>frame_old; 

     cvtColor(frame_old,gray_old,COLOR_BGR2GRAY); 
     goodFeaturesToTrack(gray_old,points,MAX_COUNT,0.001,1,Mat(),3,0,0.04); 
     cornerSubPix(gray_old,points,SubPixelWinSize,Size(-1,-1),termcrit); 

     for(;;) 
     { 
      Mat framenew; 
      Mat gray; 

      capture>>framenew;waitKey(10); 
      cvtColor(framenew,gray,COLOR_BGR2GRAY); 


      calcOpticalFlowPyrLK(gray_old,gray,points,pointsnew,status,err,winSize,3,termcrit,0,0.001); 
      size_t i,k; 
      for(i=k=0;i<pointsnew.size();i++) 
      { 

       if(!status[i]) 
        continue; 


       pointsnew[k++]=pointsnew[i]; 
       Point p1,p2; 
       p1.x= (int)points[i].x; 
       p1.y= (int)points[i].y; 
       p2.x= (int)pointsnew[i].x; 
       p2.y= (int)pointsnew[i].y; 

       line(framenew,p1,p2,Scalar(0,255,0),3,8,0); 


      } 


     pointsnew.resize(k); 
     swap(points,pointsnew); 
     gray.copyTo(gray_old); 


     imshow("new",framenew); 
     waitKey(10); 
     } 

     } 

return 0; 
} 

Таким образом, при работе с этим у меня есть только движущиеся точки с движущимися людьми, нет линий вдоль пути. Несколько раз для некоторых людей без каких-либо точек. И точки находятся в фоновом режиме (я имею в виду на статическом основании. Это не движение). Я пытался изменить параметры, но не повезло.

видео я использовал https://www.youtube.com/watch?v=H7BrVzdOzc4

Вопросы 1.Why я получаю эти плохие результаты? Почему линии отслеживания не рисуются (существуют только точки)? 2. Какие изменения необходимо сделать, чтобы получить правильный результат?

Я использовал создателя Qt с визуальной студией 2010, opencv 2.4.8, средой Windows 7.

Подумайте, мое объяснение ясное.

Любая помощь будет высоко оценена .. Спасибо !!!!

ответ

0

Метод оптического потока дает вам именно то, что он должен дать: векторы движения между двумя изображениями. Вы можете объединить его в многокадровые траектории, но вы должны сделать это сами.

«Несколько раз для некоторых людей без каких-либо точек», потому что изображение очень размыто, и у людей нет хороших функций для отслеживания (это видно из имени метода goodFeaturesToTrack (...)). Вы можете попробовать постоянный шаг сетки для этих точек для первого кадра (если вы собираетесь объединить векторы в длинные траектории).

 Смежные вопросы

  • Нет связанных вопросов^_^