Mejora del performance de detección de object conocido con OpenCV

Estoy trabajando en un proyecto donde tengo un para detectar una image conocida en una escena en "time real" en un context mobile (eso significa que estoy capturando fotogtwigs usando una camera de teléfono inteligente y cambiando el tamaño del fotogtwig para que sea 150×225). La image en sí misma puede ser bastante compleja. En este momento, estoy procesando cada fotogtwig en 1.2s en promedio (usando OpenCV). Estoy buscando forms de mejorar este time de procesamiento y la precisión global. Mi implementación actual funciona de la siguiente manera:

  1. Captura el marco
  2. Convertirlo en escala de grises
  3. Detectar el punto key y extraer los descriptores usando ORB
  4. Haga coincidir el descriptor (2NN) (object -> escena) y filtrelos con la testing de relación
  5. Haga coincidir el descriptor (2NN) (escena -> object) y filtrelos con la testing de relación
  6. Eliminación de coincidencia no simétrica con 4 y 5.
  7. Calcule la confianza de coincidencia (% de puntos de reference coincidentes con los puntos de key totales)

Mi enfoque podría no ser el correcto, pero los resultados están bien, aunque hay mucho margen de mejora. Ya me di count de que la extracción de SURF es demasiado lenta y no pude utilizar homografía (podría estar relacionado con ORB). ¡Todas las sugerencias son bienvenidas!

El performance siempre es un problema en los mobilees 🙂

Hay algunas cosas que puedes hacer. La comparación de performance de OpenCV: C ++ y C explica los methods generics en las mejoras de time de procesamiento.

Y algunos detalles para su proyecto:

  • Si captura imágenes en color y las convierte en escala de grises, es una gran pérdida de resources. El formatting de la camera nativa es YUV. Se convierte a RGB, que es costoso, luego a gris, lo que de nuevo es costoso. Todo esto mientras que el primer canal en YUV (Y) es la escala de grises … Entonces, capture YUV y extraiga el primer canal copyndo la primera parte de los datos de la image (YUV en Android es plano, eso significa que el primer w * h píxeles pertenecen al canal Y)
  • ORB fue creado para ser rápido. Y es. Pero hace solo unas semanas FREAK se agregó a OpenCV. Es un nuevo descriptor, cuyos autores afirman que es más preciso y más rápido que ORB / SIFT / SURF / etc. Pruébelo. Puede encontrarlo en opencv> = 2.4.2 (Esta es la stream ahora)

EDITAR

La pregunta de Brad Larsen es esclarecedora: si el emparejador se mantiene a 900 ms para procesar, entonces ¡eso es un problema! Verifique esta publicación por Andrey Kamaev ¿Cómo funciona el detector de funciones OpenCV ORB? donde explica las posibles combinaciones entre descriptores y emparejadores. Prueba el emparejador uchar basado en FLANN.

Y también, supongo que obtendrás una gran cantidad de detecciones, cientos o miles, si se necesita tanto para igualarlas. Intente limitar las detecciones o select solo los primeros n mejores valores.

Debe intentar FAST para detectar el object en la escena, es más rápido que SURF y puede encontrar artículos que usan una versión piramidal de FAST. Para mejorar el performance en mobilees, puede optimizar loops, usar aritmética de pozo fijo, etc. Buena suerte.