2010-09-27 11 views
5

Estoy usando el contenedor OpenCV - Emgu CV, y estoy tratando de implementar un seguidor de movimiento usando Optical Flow, pero no puedo encontrar una manera de combinar la información horizontal y vertical recuperada del algoritmo OF:¿Cómo implementar el rastreador de flujo óptico?

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

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

Mi problema es no saber cómo combinar la información de movimiento vertical y horizontal para construir el rastreador de objetos en movimiento? Una nueva imagen?

Por cierto, hay una manera fácil de mostrar la información de flujo en el cuadro actual?

Gracias de antemano.

Respuesta

9

Aquí está la función que he definido en mi youtube head movement tracker video tutorial. Puede encontrar el código fuente completo adjunto al video

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

Existen algunos algoritmos de flujo óptico conocidos. uno de ellos que puede ser bueno para usted es Lucas Kanade ... puede encontrar una fuente de Matlab here

+0

Hola, gracias por su respuesta, pero mi problema no es la implementación de los algoritmos de Optical Flow, ya que ya están en el marco de EMGU CV, mi reside en el hecho de que no sé qué hacer con los resultados de las funciones de flujo óptico. –

4

visualización del flujo óptico. El enfoque común es usar un campo de flujo 2D codificado por color. Significa que mostramos el flujo como una imagen, donde la intensidad del píxel corresponde al valor absoluto del flujo en el píxel, mientras que el tono refleja la dirección del flujo. Mire la figura 2 en [Baker et al., 2009]. Otra forma es dibujar vectores de flujo en una cuadrícula sobre la primera imagen (digamos, cada 10 píxeles).

Combinando x y y. No está claro lo que quieres decir aquí. El píxel (x, y) de la primera imagen se mueve a (x + flowx, y + flowy) en el segundo. Entonces, para rastrear un objeto, arregla la posición del objeto en la primera imagen y agrega el valor de flujo para obtener su posición en el segundo.

Cuestiones relacionadas