Procesamiento de fotogramas de la cámara de Android en tiempo real

Estoy intentando crear una aplicación para Android que procese los fotogramas de la cámara en tiempo real. Para empezar, solo quiero mostrar una versión en escala de grises de lo que ve la cámara. Me las arreglé para extraer los valores apropiados de la matriz de bytes en el onPreviewFrame método. A continuación se muestra solo un fragmento de mi código:

byte[] pic;
int pic_size;
Bitmap picframe;
public void onPreviewFrame(byte[] frame, Camera c)
{
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width;
    pic = new byte[pic_size];
    for(int i = 0; i < pic_size; i++)
    {
        pic[i] = frame[i];
    }
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size);
}

El Primer [width*height] valores de la byte[] la matriz de cuadros son los valores de luminancia (escala de grises). Una vez que los extraje, ¿cómo los visualizo en la pantalla como una imagen? Tampoco es una matriz 2D, entonces, ¿cómo especificaría el ancho y el alto?

preguntado el 12 de abril de 11 a las 07:04

3 Respuestas

Puede obtener una amplia orientación del SDK de OpenCV4Android. Mire sus ejemplos disponibles, específicamente Tutorial 1 Basic. 0 Android Camera

Pero, como fue en mi caso, para el procesamiento intensivo de imágenes, esto será más lento de lo aceptable para una aplicación de procesamiento de imágenes en tiempo real. Un buen reemplazo para su onPreviewFrame conversión de matriz de bytes a YUVImage:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

Crea un rectángulo del mismo tamaño que la imagen.

Cree un ByteArrayOutputStream y pase esto, el rectángulo y el valor de compresión a compressToJpeg ():

ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

Representar estos marcos de vista previa en una superficie y las mejores prácticas involucradas es una nueva dimensión. =)

Respondido 08 Abr '14, 06:04

¿Sucede esto para convertir la imagen YUV a un mapa de bits con un JPEG intermedio? Difícilmente una solución factible en tiempo real - con

Recomiendo encarecidamente no hacerlo. OpenCV en Android agregará complejidad al proyecto y también requerirá las bibliotecas nativas que tienen un tamaño de alrededor de 10 MB. Android tiene todas las facilidades para lograr lo que requiere el OP. OpenCV es una gran biblioteca, pero exagerada para esta situación. - miembro protegido

Este post muy antiguo me ha llamado la atención ahora.

La API disponible en el '11 era mucho más limitada. Hoy se puede usar SurfaceTexture (ver ejemplo) para obtener una vista previa de la transmisión de la cámara después de (algunas) manipulaciones.

Respondido el 17 de diciembre de 16 a las 13:12

Esta no es una tarea fácil de lograr, con las herramientas / API actuales de Android disponibles. En general, el procesamiento de imágenes en tiempo real se realiza mejor en el nivel NDK. Para mostrar solo el blanco y negro, aún puede hacerlo en java. La matriz de bytes que contiene los datos de la trama está en formato YUV, donde el plano Y es lo primero. Entonces, si obtiene solo el plano Y solo (primeros bytes de ancho x alto), ya le da el blanco y negro.

Lo logré a través de un extenso trabajo y pruebas. Puede ver la aplicación en google: https://play.google.com/store/apps/details?id=com.nm.camerafx

Respondido el 04 de Septiembre de 14 a las 23:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.