Нет хороших результатов от моего кода оптического потока opencv

0

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

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. Почему я получаю эти плохие результаты? Почему линии отслеживания не рисуются (существуют только точки)? 2.Какие изменения необходимо сделать, чтобы получить правильный результат?

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

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

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

Теги:
opencv
image-processing
opticalflow

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню