Estoy tratando de crear una aplicación para Android que va a procesar los cuadros de la cámara en tiempo real. Para empezar, sólo quiero mostrar una versión en escala de grises de lo que la cámara ve. He conseguido extraer los valores apropiados de la matriz de bytes en el onPreviewFrame método. A continuación es sólo 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);
}

La primera [width*height] valores de la byte[] marco de la matriz son la luminancia de la imagen (escala de grises) valores. Una vez que he extraído de ellos, ¿cómo puedo mostrar en la pantalla como una imagen? No es una matriz 2D, así que ¿cómo puedo especificar la anchura y la altura?

InformationsquelleAutor NavMan | 2011-04-12

3 Comentarios

  1. 10

    Usted puede obtener una amplia orientación de la OpenCV4Android SDK. Mirar en sus ejemplos, específicamente Tutorial 1 Basic. 0 Android Camera

    Pero, como lo fue en mi caso, para el intensivo de procesamiento de la imagen, de esta manera se consigue más lento de lo aceptable para una imagen en tiempo real de procesamiento de la aplicación.
    Un buen reemplazo para su onPreviewFrame ‘s byte de la matriz de conversión a YUVImage:

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

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

    Crear un ByteArrayOutputStream y pase esto, el rectángulo y la compresión de valor para compressToJpeg():

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

    byte [] imageData = baos.toByteArray();

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

    De representación de estos previewFrames sobre una superficie y las mejores prácticas que se trata de una nueva dimensión. =)

    • Sucede esto a convertir la YUV imagen a un mapa de bits con un intermediario JPEG? Apenas una posible solución en tiempo real
    • Yo les recomiendo vivamente en contra de esto. OpenCV en android se agregan complejidad al proyecto y se requiere también que el nativo de las bibliotecas, que son alrededor de 10 mb de tamaño. Android tiene todas las facilidades para lograr lo que el OP requiere. OpenCV es una gran biblioteca, pero excesivo para esta situación.
  2. 1

    Esta muy viejo post ha llamado mi atención ahora.

    La API disponible en ’11 fue mucho más limitada. Hoy en día uno puede utilizar SurfaceTexture (ver ejemplo) a la vista previa de la cámara de flujo después de algunas manipulaciones.

  3. -2

    Esta no es una tarea fácil de lograr, con la actual de Android tools/API disponible. En general, en tiempo real de procesamiento de imagen es mejor en el NDK nivel. Para que muestre solo el negro y el blanco, que todavía se puede hacer en java. La matriz de bytes que contiene el marco de datos está en formato YUV, donde el eje Y del Plano que ocurra primero. Por lo tanto, si usted consigue el sólo el eje Y del plano solo (primera altura de la anchura x bytes), que ya le da el negro y el blanco.

    Hice lograr esto a través de un trabajo extenso y ensayos. Usted puede ver la aplicación en google:
    https://play.google.com/store/apps/details?id=com.nm.camerafx

Dejar respuesta

Please enter your comment!
Please enter your name here