¿Cómo puedo acelerar mi aplicación Android-openCV?

He implementado una aplicación openCV donde uso el descriptor SURF. Está funcionando bien el código se ve así:

Reduzco el tamaño del stream de video de entrada para acelerarlo

capture.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, display.getWidth()); capture.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, display.getHeight()); capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); try{ //-- Step 1: Detect the keypoints using SURF Detector surfDetector.detect( mRgba, vector1 ); for (KeyPoint t : vector1) Core.circle(mRgba, t.pt, 10, new Scalar(100, 100,100)); //-- Step 2: Calculate descriptors (feature vectors) //extractor.compute(mRgba, vector1, descriptor1); //-- Draw matches //Mat img_matches; //drawMatches( mRgba, vector1, mRgba, vector1, matches, img_matches ); }catch(Exception e){ Log.e( "ERROR", e.toString()); } 

Pero el cálculo sigue siendo demasiado lento, así que tengo que encontrar otro método para reducir la entrada de vídeo qualllity secuencia. O si sabes otro método para acelerarlo, siéntete libre de compartirlo conmigo;)

Gracias por su tiempo y respuestas

Pero el cálculo sigue siendo demasiado lento, así que tengo que encontrar otro método para reducir la entrada de vídeo qualllity secuencia.

La verdadera respuesta a esta pregunta es mucho más cercana a "¡no hay mucho que puedas hacer!" Que a cualquier otra cosa. Tenemos que reconocer que los teléfonos móviles no tienen aún capacidades de procesamiento fuertes como cualquier escritorio. La mayoría de los teléfonos Android en el mundo siguen utilizando las versiones anteriores del sistema y lo más importante de todo: son dispositivos de un solo núcleo, se registran a velocidades inferiores a 1GHz, tienen memoria limitada, bla bla …

Sin embargo, siempre hay algo que puede hacer para mejorar la velocidad con pequeños cambios en el rendimiento.

Ahora, también estoy calculando OpenCV SURF en el GalaxyS y tengo una velocidad de fotogramas de 1,5 fps para 200 características con un umbral de hessian a 1500 en una imagen de 320×240. Admito que es el rendimiento de mierda, pero en mi caso sólo tengo que calcular las características de vez en cuando, ya que estoy midiendo el flujo óptico para fines de seguimiento. Sin embargo, es muy extraño que sólo se puede obtener sólo 1 marco cada 4-5 segundos.

1) En primer lugar, me parece que está utilizando VideoCapture para obtener los fotogramas de la cámara. Bueno, no lo soy. Estoy utilizando la implementación de la cámara Android. No he comprobado cómo se implementa VideoCapture en el puerto Java de OpenCV, pero parece ser más lento que usar la implementación en algunos de los tutoriales. Sin embargo, no puedo estar 100% seguro acerca de esto, ya que no lo he probado. ¿Lo hiciste?

2) Reducir las llamadas nativas al mínimo posible. Las llamadas Java OpenCV originales son muy costosas. Además, siga todas las directrices especificadas en la página de mejores prácticas de Android-OpenCV . Si tiene varias llamadas nativas, únase a todas ellas en una sola llamada JNI.

3) También debe reducir el tamaño de la imagen y aumentar el umbral de arpillera SURF. Esto, sin embargo, reducirá el número de características detectadas, pero serán más fuertes y más robustas con el propósito de reconocimiento y coincidencia. Usted tiene razón cuando dice que el SURF es el detector más robusto (también es el más lento, y está patentado). Pero, si esto no es una cerradura muerta para usted, yo recomendaría utilizar el nuevo detector ORB, una variante de BRIEF que funciona mejor en términos de rotación. ORB tiene, sin embargo, desventajas, tales como el número limitado de puntos clave detectados y la invarianza de escala incorrecta. Este es un parámetro muy interesante de detección de algoritmos comparación informe. También sugiere que el detector SURF es más lento en la nueva versión OpenCV 2.3.1, probablemente debido a algunos cambios en el algoritmo, para mayor robustez.

4) Ahora los bits divertidos. La arquitectura del procesador ARM (en la que se basa la mayoría de los teléfonos Android) ha sido ampliamente reportada por su lentitud que maneja los cálculos de punto flotante, en los que los algoritmos de detección de características dependen en gran medida. Ha habido discusiones muy interesantes sobre este tema, y ​​muchos dicen que debe usar cálculos de punto fijo siempre que sea posible. La nueva arquitectura armv7-neon proporciona cálculos de punto flotante más rápidos, pero no todos los dispositivos lo admiten. Para comprobar si su dispositivo lo admite, ejecute adb shell cat proc/cpuinfo . También puedes compilar tu código nativo con directivas NEON ( LOCAL_ARM_NEON := true ) pero dudo que esto LOCAL_ARM_NEON := true nada, ya que aparentemente algunas rutinas OpenCV están optimizadas con NEON. Por lo tanto, la única manera de aumentar la velocidad con esto, es reconstruir el código con NEON intrínseca (esto es un terreno completamente inexplorado para mí, pero es posible que valga la pena buscarlo). En el grupo android.opencv se sugirió que las próximas versiones de OpenCV tendrán más librerías NEON-optimizadas. Esto podría ser interesante, sin embargo no estoy seguro de si vale la pena trabajar en él o esperar CPU más rápidas y sistemas optimizados utilizando la computación GPU. Tenga en cuenta que los sistemas Android <3.0 no utilizan aceleración de hardware incorporada .

5) Si está haciendo esto con fines académicos, convencer a su universidad para comprar un mejor dispositivo ^^. Esto podría ser en última instancia la mejor opción para la detección más rápida de la característica de SURF. Otra opción es reescribir los algoritmos. Soy consciente de que algunos chicos de los laboratorios de Intel lo hicieron, con cierto éxito pero, obviamente, no lo compartirán. Honestamente, después de investigar este tema durante unas semanas, me di cuenta de que para mis necesidades específicas, (ya que no soy un ingeniero informático ni un experto en algoritmos) hay más valor en esperar unos meses por mejores dispositivos que golpearme la cabeza En la pared que disecciona los algoritmos y que desarrolla el código cercano al ensamblaje.

Saludos y buena suerte!

¿Necesita utilizar la función / descriptor SURF para su aplicación? SURF es atractivo, ya que coincide muy bien, pero como usted ha descubierto que es un poco lento. Si solo estás siguiendo puntos a través de un video, puedes asumir que los puntos no varían mucho de fotograma a cuadro y así puedes detectar y combinar las esquinas de Harris / FAST y luego filtrar los partidos para que sean válidos sólo si están dentro Un radio de x píxeles del punto original?

OpenCV tiene una selección (aunque algo limitada) de detectores de funciones y extractores de descriptor y descriptor de coincidencias , valdría la pena investigar las opciones si aún no lo has hecho.

  • Opencv C + + crear objeto Mat de android NV21 buffer de datos de imagen
  • Utils.bitmapToMat bloqueo de la aplicación
  • Android "No hay tal archivo o directorio" error?
  • Android, genera archivos de encabezado jni con javah, muestra error que no puede encontrar org.opencv.core.Mat
  • OpenCV con Android NDK Referencias indefinidas
  • Eliminar el deslumbramiento de la foto opencv
  • Android UnsatisfiedLinkError con OpenCV 2.4.2
  • OpenCV en Android - Encabezados; No hay tal directorio de archivos
  • Correspondencia de plantillas en Android usando openCV
  • Multiplicación básica de matriz en OpenCV para Android
  • La cámara no está abierta - Inicialización estática en OpenCV Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.