Cómo encontrar el movimiento global de la cámara.

Encontrar el movimiento global de una cámara es una tarea difícil teniendo en cuenta que la única fuente de información es la transmisión de video. La precisión depende en gran medida de la elección de la cámara y el algoritmo. Primero hay que encontrar los puntos de referencia en la imagen y comenzar a rastrearlos en cuadros posteriores. Ahora este es un enfoque, que implica la extracción de características de algos como SIFT, SURF, MSER … etc. Cuando eliges uno de estos, deberías comprender aspectos como velocidad, precisión, repetibilidad, estabilidad. Todos estos métodos han sido revisados ​​en detalle en este documento tutorial Visual Odometry [Tutorial] por Scaramuzza. Tiene mucho para comenzar tu estudio en este campo. Como Kadir señaló en su respuesta el uso de RanSaC para eliminar los valores atípicos, creo que es imperativo que uno lo use ya que los resultados de seguimiento seguramente tendrán valores atípicos. Para comenzar de manera simple, puede probar los ejemplos de Learning OpenCV de OReillly, aquellos en los capítulos 11,12 que involucran la calibración de la cámara y la visión en 3D. Este es un buen punto de partida para obtener el código. Espero eso ayude.

Compartiendo pensamientos,
Vale la pena tu tiempo.

Primero obtienes un campo de movimiento. Podría ser denso, es decir, usar flujo óptico, lo que significa que tiene un vector de movimiento para todos los píxeles. O podría ser escaso, por ejemplo, utilizando vectores de movimiento MPEG que ya están disponibles en la mayoría de los videos codificados. O puede hacer algo como encontrar características locales (por ejemplo, SIFT) y hacerlas coincidir entre cuadros consecutivos. Luego intenta ajustar un modelo global a los vectores de movimiento que tiene.

Los modelos globales describen el vector de movimiento esperado en píxeles basado en un movimiento de cámara dado. Por ejemplo, una panorámica de la cámara generalmente se indica mediante vectores de movimiento horizontal fuertes y aproximadamente uniformes, mientras que el acercamiento / alejamiento se indica mediante un patrón de vector de movimiento radialmente hacia afuera o hacia adentro. Por lo general, es más fácil detectar el zoom y la panorámica / inclinación; pero más difícil de diferenciar entre la rotación horizontal de la cámara (panorámica) y la traslación horizontal (¿seguimiento?).

Por supuesto, las diferentes distancias de los objetos desde la cámara y el movimiento de los objetos en sí complican el asunto. Entonces las personas usan diferentes técnicas para obtener resultados sólidos. Por ejemplo, puede usar algún tipo de método de eliminación o consenso atípico como RANSAC para deshacerse de los vectores que no están de acuerdo con el modelo. O a veces las personas usan enfoques burdos que son robustos pero no demasiado precisos. Por ejemplo, puede promediar los componentes x e y de los vectores de movimiento y ver si uno es significativamente alto, lo que indica una panorámica o una inclinación. O puede hacer un histograma de ángulos de vector de movimiento.

Puede encontrar muchos documentos sobre el tema si busca “estimación de movimiento de cámara”, “modelado de movimiento de cámara”, etc. (o puede reemplazar el movimiento de la cámara con movimiento global). Recuerdo que este es un problema de investigación activo cuando trabajo en la indexación de video basada en contenido. También se usa mucho para aplicaciones como estabilización de video, predicción de movimiento del ego, etc.

Lo que necesita es odometría visual monocular.
Echa un vistazo a este proyecto de código abierto: uzh-rpg / rpg_svo

Y, aquí también hay una publicación escrita por mí sobre Visual Odometry (aunque se centra en la versión estéreo de la misma): Visual Odmetry desde cero: un tutorial para principiantes
El código MATLAB para el mismo también está disponible.