Android Asynctask para procesar tramas de video en vivo

Estoy utilizando OpenCV para intentar realizar un procesamiento de video en vivo. Dado que el procesamiento es bastante pesado, retrasa los marcos de salida significativamente, haciendo que la transmisión en directo parezca agitada.

Me gustaría descargar algunos de los procesamientos en un AsyncTask. Lo he probado y en realidad hace el video mucho más suave. Sin embargo, termina encima de comenzar una gran cantidad de tareas a la vez, y entonces lentamente comenzarán a volver con algunos resultados.

¿Hay alguna manera de ralentizar esto, y esperar a un resultado, ya sea utilizando Synchronize declaraciones, o algún otro método?

En cada marco de la cámara, comienzo una de estas tareas. DoImgProcessing realiza el proceso largo y devuelve un resultado de cadena.

private class LongOperation extends AsyncTask<Mat, Void, String> { @Override protected String doInBackground(Mat... params) { Mat inputFrame = params[0]; cropToCenter(inputFrame); return doImgProcessing(inputFrame); } @Override protected void onPostExecute(String result) { Log.d(TAG, "on post execute: "+result); } @Override protected void onPreExecute() { Log.d(TAG, "on pre execute"); } } public Mat onCameraFrame(Mat inputFrame) { inputFrame.copyTo(mRgba);//this will be used for the live stream LongOperation op = new LongOperation(); op.execute(inputFrame); return mRgba; } 

Yo haría algo así:

 // Example value for a timeout. private static final long TIMEOUT = 1000L; private BlockingQueue<Mat> frames = new LinkedBlockingQueue<Mat>(); Thread worker = new Thread() { @Override public void run() { while (running) { Mat inputFrame = frames.poll(TIMEOUT, TimeUnit.MILLISECONDS); if (inputFrame == null) { // timeout. Also, with a try {} catch block poll can be interrupted via Thread.interrupt() so not to wait for the timeout. continue; } cropToCenter(inputFrame); String result = doImgProcessing(inputFrame); } } }; worker.start(); public Mat onCameraFrame(Mat inputFrame) { inputFrame.copyTo(mRgba);//this will be used for the live stream frames.put(inputFrame); return mRgba; } 

El onCameraFrame coloca el marco en la fila, el trabajador encuestas de hilo de la cola.

Esto decorelate la recepción y el tratamiento del marco. Puede supervisar el crecimiento de la cola utilizando frames.size() .

Este es un típico ejemplo de productor-consumidor.

Si lo hace en cada fotograma, suena como si necesitara un hilo en su lugar. Un AsyncTask es para cuando desea realizar una actividad única en otro subproceso. Aquí usted quiere hacerlo repetidamente. Basta con crear un hilo y, cuando termine un marco, ponga un mensaje en un controlador para ejecutar el paso de publicación en el subproceso de UI. Puede esperar en un semáforo en la parte superior de su bucle para que el siguiente cuadro esté listo.

  • Cómo obtener el objeto Mat desde el byte en openCV android?
  • Incluir OpenCV en el paquete de aplicaciones de Android
  • Detectar los límites de un documento en una imagen usando opencv java
  • Cómo cambiar el tamaño de una imagen a la imagen de alta resolución sin perder píxeles?
  • Android flood-fill algoritmo
  • Recortar parte particular de la imagen en android
  • Programación de GPU en dispositivos Android
  • Android cómo hacer la diapositiva de pantalla de imagen?
  • Utilizando el array de bytes de la cámara en bruto para la realidad aumentada
  • ¿Hay alguna biblioteca de efectos de imagen (por ejemplo, lomo) para Android o iPhone?
  • Ajuste automático de brillo, contraste y nitidez de una imagen de mapa de bits
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.