2010-09-27 12 views
5

Я использую оболочку OpenCV - Emgu CV, и я пытаюсь реализовать отслеживатель движения с использованием Optical Flow, но я не могу понять способ объединения горизонтальной и вертикальной информации, полученной из алгоритма OF:Как реализовать оптический отслежыватель потока?

flowx = new Image<Gray, float>(size); 
flowy = new Image<Gray, float>(size); 

OpticalFlow.LK(currImg, prevImg, new Size(15, 15), flowx, flowy); 

Моя проблема не в том, чтобы знать, как объединить информацию о вертикальном и горизонтальном движении, чтобы построить трекер движущихся объектов? Новый образ?

Кстати, есть простой способ отображения информации о потоке в текущем кадре?

Заранее спасибо.

ответ

9

Вот функция, которую я определил в своем youtube head movement tracker video tutorial. Вы можете найти полный исходный код, прикрепленный к видео

void ComputeDenseOpticalFlow() 
    { 
     // Compute dense optical flow using Horn and Schunk algo 
     velx = new Image<Gray, float>(faceGrayImage.Size); 
     vely = new Image<Gray, float>(faceNextGrayImage.Size); 

     OpticalFlow.HS(faceGrayImage, faceNextGrayImage, true, velx, vely, 0.1d, new MCvTermCriteria(100));    

     #region Dense Optical Flow Drawing 
     Size winSize = new Size(10, 10); 
     vectorFieldX = (int)Math.Round((double)faceGrayImage.Width/winSize.Width); 
     vectorFieldY = (int)Math.Round((double)faceGrayImage.Height/winSize.Height); 
     sumVectorFieldX = 0f; 
     sumVectorFieldY = 0f; 
     vectorField = new PointF[vectorFieldX][]; 
     for (int i = 0; i < vectorFieldX; i++) 
     { 
      vectorField[i] = new PointF[vectorFieldY]; 
      for (int j = 0; j < vectorFieldY; j++) 
      { 
       Gray velx_gray = velx[j * winSize.Width, i * winSize.Width]; 
       float velx_float = (float)velx_gray.Intensity; 
       Gray vely_gray = vely[j * winSize.Height, i * winSize.Height]; 
       float vely_float = (float)vely_gray.Intensity; 
       sumVectorFieldX += velx_float; 
       sumVectorFieldY += vely_float; 
       vectorField[i][j] = new PointF(velx_float, vely_float); 

       Cross2DF cr = new Cross2DF(
        new PointF((i*winSize.Width) +trackingArea.X, 
           (j*winSize.Height)+trackingArea.Y), 
           1, 1); 
       opticalFlowFrame.Draw(cr, new Bgr(Color.Red), 1); 

       LineSegment2D ci = new LineSegment2D(
        new Point((i*winSize.Width)+trackingArea.X, 
           (j * winSize.Height)+trackingArea.Y), 
        new Point((int)((i * winSize.Width) + trackingArea.X + velx_float), 
           (int)((j * winSize.Height) + trackingArea.Y + vely_float))); 
       opticalFlowFrame.Draw(ci, new Bgr(Color.Yellow), 1); 

      } 
     } 
     #endregion 
    } 
0

Существуют некоторые известные алгоритмы оптического потока. один из них, который может быть вам полезен, - Lucas Kanade .. вы можете найти источник в Matlab here

+0

Привет, спасибо за ваш ответ, но моя проблема заключается не в реализации алгоритмов оптического потока, поскольку они уже находятся в среде EMGU CV, но в том, что я не знаю, что делать с результатами функций оптического потока. –

4

визуализации оптического потока. Общий подход заключается в использовании цветного поля 2D-потока. Это означает, что мы отображаем поток как изображение, где интенсивность пикселей соответствует абсолютному значению потока в пикселе, а оттенок отражает направление потока. Посмотрите на Рис.2 в [Baker et al., 2009]. Другой способ - нарисовать векторы потока в сетке над первым изображением (скажем, каждые 10 пикселей).

Объединение x и y. Неясно, что вы имеете в виду здесь. Пиксель (x, y) от первого изображения перемещается на (x + flowx, y + flowy) на втором. Итак, чтобы отслеживать объект, вы фиксируете положение объекта на первом изображении и добавляете значение потока, чтобы получить его положение на втором.

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