2012-06-19 38 views
5

Estoy usando la función Pyramid Lukas Kanade de OpenCV para estimar el flujo óptico. llamo al cvGoodFeaturesToTrack y luego al cvCalcOpticalFlowPyrLK. Este es mi código:Flujo óptico usando opencv

while(1) 
{ 
... 

cvGoodFeaturesToTrack(frameAth,eig_image,tmp_image,cornersA,&corner_count,0.01,5,NULL,3,0.4); 

std::cout<<"CORNER COUNT AFTER GOOD FEATURES2TRACK CALL = "<<corner_count<<std::endl; 

cvCalcOpticalFlowPyrLK(frameAth,frameBth,pyrA,pyrB,cornersA,cornersB,corner_count,cvSize(win_size,win_size),5,features_found,features_errors,cvTermCriteria(CV_TERMCRIT_ITER| CV_TERMCRIT_EPS,20,0.3),CV_LKFLOW_PYR_A_READY|CV_LKFLOW_PYR_B_READY); 

cvCopy(frameBth,frameAth,0); 
... 
} 

frameAth es el marco gris anterior y frameBth es el actual marco gris de una webcam. Pero cuando presento el número de buenas características para seguir en cada cuadro, el número disminuye después de la suma y sigue disminuyendo. pero si termino el programa y ejecuto el código otra vez (sin alterar el campo de visión de la cámara web), se muestran muchos más puntos como buenas características para seguir ... ¿Cómo se puede para el mismo campo de visión y para el mismo escena la función da tanta diferencia en el número de puntos ... y la diferencia es alta ... por ejemplo, el número de puntos como buenas características para seguir después de 4 minutos de ejecución es 20 o 50 ... pero cuando el mismo programa finaliza y ejecutado de nuevo, el número es de 500 a 700 inicialmente, pero de nuevo disminuye lentamente ... estoy usando opencv durante los últimos 4 meses, por lo que soy lil nuevo para abrirCV ... por favor guíanme o dime dónde puedo encontrar una solución ... un montón de Gracias por adelantado ...

Respuesta

1

Llamas cvGoodFeatureToTrack y pasas corner_count por referencia. Su valor disminuye si se encuentran menos características. Debe restablecer el valor de corner_count a su valor inicial antes de llamar al cvGoodFeaturesToTrack en cada iteración del ciclo while.

+0

@ sgar91 ... gracias ... Tuve una mejora en el rendimiento por su sugerencia –

+0

tuve el mismo problema hace un tiempo. – sgarizvi

+0

@rotating_image No entiendo por qué esta respuesta fue aceptada. Cuando restablece el número de características, no tiene sentido llamar 'cvCalcOpticalFlowPyrLK'. Le dará el mismo resultado cuando no lo llame ... Lea los documentos primero. – ArtemStorozhuk

6

Tienes que llamar al cvGoodFeaturesToTrack una vez (al principio, antes del bucle) para detectar buenas funciones para rastrear y seguir estas funciones usando cvCalcOpticalFlowPyrLK. Eche un vistazo al ejemplo de opencv predeterminado: OpenCV/samples/cpp/lkdemo.cpp.

+0

@Astor ... thanx Astor para una respuesta rápida ... el proceso que dijiste funciona bien para rastrear un objeto en movimiento en el campo de visión ... sin embargo, estoy usando un flujo óptico para estimar el movimiento de la cámara..so cuando una cámara se está moviendo, su campo de visión está cambiando ... los detalles de la escena también cambian lentamente ... así que si llamo a goodfeaturestotrack una vez, cuando la escena cambia lentamente no obtengo nuevos puntos porque los puntos iniciales podrían no estar presentes en el nuevo cuadro ... –

+0

@ user1466741 Para detectar el movimiento de la cámara, puede usar la detección de movimiento usando [resta marco] (http://www.youtube.com/watch?v=KREoXEy9ojY). Este algoritmo es muy fácil: debe restar dos cuadros consistentes, hacer el umbral y verificar si el área de movimiento (píxeles blancos en el video) es grande (80% del área total o algo así) y luego la cámara se está moviendo. Sin embargo, este algoritmo es malo cuando illumanion está cambiando (enciende/apaga las luces) o cuando alguien (o algo) se mueve muy cerca de la cámara. – ArtemStorozhuk

+0

@Astor ... gracias por la idea, pero con flujo óptico puedo obtener la dirección y la magnitud del movimiento fácilmente ... llamará periódicamente a las funciones buenastotrack función (después de cierto número de cuadros o cuando el número de goodpoints2track baje) resolver el problema? me refiero a si sigo refrescando los puntos para rastrear ... –