Detección de imágenes en paralelo y vista previa de la cámara OpenCV Android

Estoy usando OpenCV para detectar una imagen. Aquí está mi problema: mi función detect_image(mRgba) necesita algo de tiempo para realizar operaciones y dar algunos resultados. Mientras que la función está computando la previsualización de la cámara es congelada porque muestra solamente la imagen cuando el código alcanza el return inputFrame.rgba() quisiera saber cómo hacer que la operación paralela, la función estará computando en un fondo mientras que la inspección previo de cámara trabaja con velocidad normal.

 public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); detect_image(mRgba); return inputFrame.rgba(); } 

Para obtener sólo un gusto en la paralelización, el enfoque sencillo sería simplemente utilizar un AsyncTask para procesar sus imágenes:

Página de referencia AsyncTask

Una introducción más amigable se puede encontrar aquí:

http://android-developers.blogspot.co.il/2010/07/multithreading-for-performance.html

mientras esto:

http://developer.att.com/developer/forward.jsp?passedItemId=11900176

es una buena introducción a multi-threading en Android.

Si quieres empezar , un algoritmo simple debería funcionar así:

  • desde su método "onCameraFrame" compruebe si tiene un AsyncThread para procesar la imagen que ya se está ejecutando
  • si la respuesta es "sí", sólo muestro mRgba en la ventana de vista previa y devuelve
  • si la respuesta es "no", inicie un nuevo AsyncThread y déjelo ejecutar "detectImage" en mRgba, asegurándose de que los resultados se guardan en el método onPostExecute.

Con este algoritmo, si su sistema puede detectar 4 imágenes por segundo mientras toma una vista previa a 60fps (por ejemplo), usted será capaz de obtener un video suave con un nuevo resultado sobre cada 20-30 marcos en un solo dispositivo de procesador, bajo la suposición real de que detect_image es intensivo en la CPU mientras que la vista previa de la cámara es intensiva de E / S.

    Captura: xxxxxxxxxxxxxxxxxxxx ...
    Procesamiento: 1 ....... 1 ....... 1 ....... 1 ..... 1 ....... 1 ....
                 tiempo ------------------------------------>

Comenzando con HoneyComb, un enfoque más refinado sería dar cuenta del número de núcleos en su CPU (los teléfonos multinúcleo / tabletas se están volviendo cada vez más comunes) e iniciar N AsyncTask en paralelo (uno para cada núcleo), alimentando una imagen de vista previa diferente a cada uno uno (tal vez utilizando un grupo de hilos …).

Si separa cada subproceso por un retardo fijo (sobre la duración de detectImage / N), debería obtener un flujo constante de resultados con una frecuencia que debería ser un múltiplo de la versión de subproceso único.

    Captura: xxxxxxxxxxxxxxxxxxxx ...
    Procesamiento: 1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4.1.2.3.4 ....
                 tiempo ------------------------------------>

Espero que esto ayude

  • Píxeles de la cámara girados
  • Android: BitmapFactory.decodeByteArray ofrece bitmap pixelado
  • Cómo componer (combinar) dos imagen de la foto en android?
  • Optimización de la mezcla por pixel en mapas de bits de Android
  • Sobel Edge Detection en Android
  • Android: creación de un mapa de bits con contenido de SurfaceView
  • Android Paper Detection con OpenCV
  • Android Asynctask para procesar tramas de video en vivo
  • ¿Podemos utilizar la clase EffectFactory para versiones inferiores
  • Cómo cambiar el tamaño de una imagen a la imagen de alta resolución sin perder píxeles?
  • No se puede importar javax.imageio.ImageIO en la aplicación de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.