with tutorial the para library learning descargar computer c++ opencv computer-vision

c++ - tutorial - opencv github



Característica de seguimiento utilizando flujo óptico (3)

Solo para fines de documentación, hay varias implementaciones buenas de GPU / C ++ de seguimiento de flujo óptico. Su código puede ser mejor para sus propósitos, pero si todo lo que necesita son los datos de salida de las pistas, considere verificar cualquiera de las siguientes fuentes: here , here o here .

Encontré una pregunta similar en el foro. Pero la respuesta allí no responde mi pregunta.

  • Si presento la detección (goodFeaturesToTrack) solo una vez en la primera imagen y luego uso el flujo óptico (calcOpticalFlowPyrLK) para rastrear estas características, el problema es que solo se pueden rastrear las características detectadas en la primera imagen. Cuando estas funciones van más allá de la imagen, no hay funciones para seguir.

  • Si presento detección para cada imagen nueva , el seguimiento de funciones no es estable, porque la función detectada la última vez puede no detectarse esta vez.

Estoy usando flujo óptico para la reconstrucción en 3D. Así que no estoy interesado en rastrear qué características, en cambio, solo me importa si las características en el campo de visión se pueden rastrear de manera estable. Para resumir, mi pregunta es : ¿cómo puedo usar el flujo óptico para rastrear características antiguas y, mientras tanto, agregar nuevas características de imagen que entran en el campo de visión y eliminar las funciones antiguas que van más allá del campo de visión?


Varios enfoques son posibles. Un buen método es el siguiente:

  1. en el Cuadro 1 detectar N características, este es el fotograma clave m = 1
  2. en el cuadro k rastrear las características por flujo óptico
  3. en el Recuadro k si la cantidad de funciones rastreadas exitosamente cae bajo N / 2:
    • este marco es el fotograma clave m + 1
    • calcular la homografía o la matriz fundamental que describe el movimiento entre los fotogramas clave m y m + 1
    • detectar N características y descartar las antiguas
    • k: = k + 1 ir a 2

En este método, básicamente, se calcula el movimiento de la cámara entre los dos últimos fotogramas clave.

Como no mencionó qué enfoque se usa para la reconstrucción en 3D, asumí que H o F se computan primero para el movimiento estimado. Para estimarlos con precisión, la línea base entre los fotogramas clave debe ser lo más amplia posible. En general, la mejor estrategia es tener en cuenta el modelo de movimiento aproximado de la cámara. Si la cámara se sostiene con la mano, se debe utilizar una estrategia diferente en comparación con cuando la cámara se fija en la parte superior de un automóvil o un robot. Puedo proporcionar un ejemplo de trabajo mínimo en Python si eso me ayuda, házmelo saber.


Hay otra buena manera de agregar nuevas características a las existentes. Puede pasar una máscara a cv::goodFeaturesToTrack() . Así crearía una nueva Mat (del mismo tamaño que la imagen original, type: CV_8UC1 ), establezca todos los píxeles en 255 y dibuje cada punto de característica como un círculo negro en esta Mat. Cuando pase esta máscara a goodFeaturesToTrack() la función omitirá esos círculos negros.

También recomendaría limitar la cantidad de características. Digamos que lo MAX_FEATURES = 300 a MAX_FEATURES = 300 . Luego revisa cada ciclo si tiene menos pistas que MAX_FEATURES - z (eg z = 30) . En caso de que lo haga, busque hasta z nuevas características como se indica arriba y agréguelas a su contenedor de características.

También tenga en cuenta que debe eliminar activamente las características cuando falla el seguimiento. Por lo tanto, tendrá que mirar la salida de estado de calcOpticalFlowPyrLK .