Flujo óptico rápido aproximado / cambio de imagen


9

Necesito detectar qué tan rápido se mueve una cámara (horizontal / vertical) para advertirle al operador que disminuya la velocidad.

Toda la imagen se mueve como un bloque, no necesito una dirección real (aunque H o V sería una ventaja) y solo necesito una magnitud aproximada, es decir. se dispara si más de 'N' píxeles cambian entre cuadros.

Las imágenes son escenas grandes y generalmente uniformes de bajo contraste, no tengo ningún resaltado obvio que rastrear. Necesito hacerlo en tiempo real (60 fps) y sin usar toda la CPU.

La solución de Niave es elegir un ROI en el centro, encontrar bordes, calcular similitudes entre pares de cuadros, desplazar uno de los cuadros hacia la izquierda / derecha / arriba / abajo por un píxel, repetir - buscar mínimos.

Me preguntaba si había una solución más inteligente.

Respuestas:


3

Probablemente, si está buscando un método simple , es aplicar los algoritmos de estimación de movimiento estándar que están muy maduros en la clase de códecs de compresión MPEG. Son fáciles de entender y supongo que tendrás muchos códigos listos para usar. Este algoritmo produce un vector de movimiento bloque por bloque, y luego puede encontrar el grupo más prominente y tomar la dirección y magnitud promedio del vector de movimiento.

MPEG4: tiene otro concepto clave llamado " Compensación de movimiento global ", una técnica que intenta primero estimar y compensar el movimiento y la panorámica de la cámara. La belleza es que tales métodos pueden ser más simples o exhaustivos dependiendo de la complejidad. Aquí hay un ejemplo de papel y otro papel para el mismo.

En general, la panorámica de la cámara y la estimación del movimiento es un dominio de investigación bastante establecido. Aquí hay una referencia: papel y otro papel .

En esta asignatura. Encontrará tanto algoritmo riguroso y preciso como simples y rápidos.


Si puedo conectarme convenientemente a una biblioteca MPEG que sería bueno, recuerdo que GMC en Mpeg tenía críticas. Pensé que sería un área común debido a los algoritmos de estabilización de la cámara
Martin Beckett

Definitivamente puede enganchar (o más bien extraer) algoritmos MPEG. Puede usar FFMPEG como biblioteca y extraer eso, pero puede ser complicado. Alternativamente, puede leer el código ordenado de MSSG para extraer.
Dipan Mehta

Con respecto a las críticas a GMC, es más que prometedor reducir drásticamente la tasa de bits y crear codificación basada en objetos . Sin embargo, no es realmente tan difícil estimar los parámetros de movimiento de la cámara.
Dipan Mehta

gracias, echaré un vistazo a MSSG. ¡Uso ffmpeg pero no es una biblioteca fácil de sacar cosas!
Martin Beckett

3

Esta podría ser una solución lenta y terrible, pero podría hacer una correlación cruzada basada en FFT de cuadros posteriores y luego encontrar el pico para identificar el desplazamiento entre cuadros. Quizás solo lo haga en un pequeño subconjunto de la imagen para guardar los ciclos del procesador.

No funcionaría con rotación o cambios drásticos de escena de un cuadro a otro, y probablemente haya mejores métodos. Esta es una especie de solución "Tengo un martillo para que todo parezca un clavo". Supongo que esto es como su solución ingenua, excepto que no hay necesidad de detección de bordes y la FFT lo hace mucho más rápido que cambiar explícitamente un píxel a la vez.

Esta pregunta es similar, y nadie sugiere nada más que correlación cruzada, por lo que tal vez no sea tan malo: usar MATLAB para calcular el desplazamiento entre imágenes sucesivas


Gracias, es fácil suponer que FFT es lento, pero puedo hacer una pequeña ventana de 2 ^ n. PD. Solo para la búsqueda stackoverflow.com/questions/1100100/…
Martin Beckett

3

Una forma de estimar la velocidad y la dirección sería hacer una estimación de flujo "local" de, por ejemplo, cuatro ventanas en el centro de la imagen. El método diferencial de Lucas-Kanade supone que el desplazamiento es aproximadamente constante y, por lo tanto, es posible resolverlo como una ecuación.

Entonces mi guía paso a paso sería:

  1. Obtenga una ventana de píxeles en el centro de la imagen, por ejemplo, 20x20
  2. Calcule los gradientes Ix e Iy.
  3. Divida la ventana de degradado en cuatro partes, por ejemplo, 4x10x10.
  4. Resuelve las cuatro ecuaciones lineales de mínimos cuadrados con el siguiente cuadro.
  5. Promedio de los cuatro vectores de velocidad.

Esto determina la dirección y la velocidad, sin embargo, podría usar una ventana ponderada para hacerla más robusta. Mire el método Lucas-Kanade para sus extensiones.


0

Creo que la correlación cruzada es un buen enfoque para encontrar el desplazamiento, pero si desea hacerlo realmente rápido, podría intentar restringirlo a una sola línea de exploración vertical y horizontal (es decir, a través del centro de la imagen). Calcular la correlación cruzada entre las líneas de exploración en ambos cuadros debería darle una aproximación del desplazamiento horizontal y vertical.


Esto podría funcionar, pero si se desplaza en diagonal, no funcionará bien, incluso si solo se mueve un poco hacia arriba y hacia abajo mientras se desplaza hacia los lados. Creo que una subregión rectangular en el centro de la imagen sería mejor.
Endolith
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.