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.
- Primeros pasos para crear un efecto de chroma key utilizando la cámara android
- Biblioteca de OCR para Android
- Animar la imagen de la cara - usando deformación?
- ¿Es posible cortar un mapa de bits a piezas pequeñas sin cargar toda la cosa en la memoria?
- Umbral adaptable rápido para Canny Edge Detector en Android
¿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; }
- Cómo devolver una imagen de opencv y mostrar en código androide java?
- Cómo convertir una imagen en escala de grises?
- OpenCV - Java: función inRange
- Android: creación de un mapa de bits con contenido de SurfaceView
- ¿Cómo puedo crear efectos de fotos en Android?
- Umbral en Android con opencv
- OutOfMemoryError: Android gran rotación de mapa de bits (90 °)
- Detección de objetos android opencv
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.
- Tomando fotos cada 66 milisegundos en el teléfono Android para el análisis de color (monitor de ritmo cardíaco)
- ¿Cómo puedo diseñar las pestañas de Android para obtener un aspecto 3D?