Quiero hacer algo de procesamiento de la imagen para los píxeles recibido de la cámara.

El problema es que los píxeles de la cámara se gira 90 grados.

Im obtener los píxeles dentro del método onPreviewFrame(byte[] data, Camera camera)

Traté de camera.setDisplayOrientation(90); y se muestra el vídeo en la orientación correcta, pero todavía estoy recibiendo el girado píxeles como se indica en la documentación:

Esto no afecta el orden de la matriz de bytes pasado en
Android.De Hardware.De la cámara.IPreviewCallback.OnPreviewFrame(Byte[],
Android.De Hardware.De la cámara), JPEG, fotos, o vídeos grabados.

También probé:

parameters.setRotation(90);
camera.setParameters(parameters);

pero que no funcionó.

Estoy usando android 2.2

cámara píxeles girado

Parte superior de la imagen muestra el SurfaceView cuando se utiliza camera.setDisplayOrientation(90);

La segunda imagen es recibido dentro de onPreviewFrame(byte[] data, Camera camera) de la data matriz. Como se puede ver el data matriz viene girado.

OriginalEl autor Enrique | 2011-07-28

4 Comentarios

  1. 7

    Mientras estoy un poco tarde a la fiesta, he aquí un método que escribió que otros pueden encontrar útil para girar una YUV420sp (NV21) de la imagen. Ninguno de los otros métodos que he visto en LO que parecía realmente hacerlo.

    public static byte[] rotateNV21(final byte[] yuv,
    final int width,
    final int height,
    final int rotation)
    {
    if (rotation == 0) return yuv;
    if (rotation % 90 != 0 || rotation < 0 || rotation > 270) {
    throw new IllegalArgumentException("0 <= rotation < 360, rotation % 90 == 0");
    }
    final byte[]  output    = new byte[yuv.length];
    final int     frameSize = width * height;
    final boolean swap      = rotation % 180 != 0;
    final boolean xflip     = rotation % 270 != 0;
    final boolean yflip     = rotation >= 180;
    for (int j = 0; j < height; j++) {
    for (int i = 0; i < width; i++) {
    final int yIn = j * width + i;
    final int uIn = frameSize + (j >> 1) * width + (i & ~1);
    final int vIn = uIn       + 1;
    final int wOut     = swap  ? height              : width;
    final int hOut     = swap  ? width               : height;
    final int iSwapped = swap  ? j                   : i;
    final int jSwapped = swap  ? i                   : j;
    final int iOut     = xflip ? wOut - iSwapped - 1 : iSwapped;
    final int jOut     = yflip ? hOut - jSwapped - 1 : jSwapped;
    final int yOut = jOut * wOut + iOut;
    final int uOut = frameSize + (jOut >> 1) * wOut + (iOut & ~1);
    final int vOut = uOut + 1;
    output[yOut] = (byte)(0xff & yuv[yIn]);
    output[uOut] = (byte)(0xff & yuv[uIn]);
    output[vOut] = (byte)(0xff & yuv[vIn]);
    }
    }
    return output;
    }
    precaución: Esto parece que se originan a partir de github.com/SMSSecure/SMSSecure/blob/master/src/org/smssecure/… y el proyecto está etiquetado de la GPLv3. Herramientas buscando GPL infracciones pueden bandera de su programa si el uso de este.
    se originó a partir de github.com/WhisperSystems/Signal-Android/blob/master/src/org/… fuente: la escribí y la puso allí.
    Gracias, parece que el primer éxito del proyecto es un fork de su proyecto. De todos modos, hay GPLv3 y herramientas que buscan GPL violaciones pueden bandera de código con este fragmento. (Para mí: yo estaba revisando una pieza de código propietario, donde este fragmento se paró y empezó a buscar en google de donde viene. Ahora se ha retirado de la propiedad codespace.)
    output[uOut] = (byte)(0xff & yuv[uIn]); ArrayIndexOutOFBoundsException 🙁
    mientras que la decodificación de esta girado byte de la matriz de mapa de bits devuelve null? puede usted por favor me ayude en esto

    OriginalEl autor jake

  2. 5

    Tal vez usted puede realizar su procesamiento de imágenes en el lado del marco, y sólo preocuparse de rotación cuando se visualiza (que ya lo ha hecho). Si no, usted necesita para girar el marco de la vieja usanza. He encontrado algo de código en algún lugar (con un poco de modificación) que podrían ayudar:

    //load the origial bitmap
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
    R.drawable.android);
    int width = bitmap.width();
    int height = bitmap.height();
    //create a matrix for the manipulation
    Matrix matrix = new Matrix();
    //rotate the Bitmap 90 degrees (counterclockwise)
    matrix.postRotate(90);
    //recreate the new Bitmap, swap width and height and apply transform
    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
    width, height, matrix, true);

    Esto es fácil porque el createBitmap método se basa en una matriz de transformación:
    http://developer.android.com/reference/android/graphics/Bitmap.html#createBitmap(android.graphics.Bitmap, int, int, int, int, android.gráficos.Matriz booleana)

    no trabajo de mapa de bits devuelve null en onpreviewframe método

    OriginalEl autor Matt Montag

  3. 4

    Si usted está recibiendo un YUV420 matriz de bytes, a continuación, el siguiente método puede rotar esta por 90 grados.

    private byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) 
    {
    byte [] yuv = new byte[imageWidth*imageHeight*3/2];
    //Rotate the Y luma
    int i = 0;
    for(int x = 0;x < imageWidth;x++)
    {
    for(int y = imageHeight-1;y >= 0;y--)                               
    {
    yuv[i] = data[y*imageWidth+x];
    i++;
    }
    }
    //Rotate the U and V color components 
    i = imageWidth*imageHeight*3/2-1;
    for(int x = imageWidth-1;x > 0;x=x-2)
    {
    for(int y = 0;y < imageHeight/2;y++)                                
    {
    yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+x];
    i--;
    yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+(x-1)];
    i--;
    }
    }
    return yuv;
    }

    (Tenga en cuenta que esto sólo puede funcionar si la anchura y la altura es un factor de 4)

    no funciona! Por favor, ayúdenme con esto dio un ArrayIndexOutOFBoundsException

    OriginalEl autor Johannes

  4. 2

    Puede rotar los datos en bruto de la siguiente manera:

    //Rotate the data for Portait Mode
    byte[] rotatedData = new byte[data.length];
    for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++)
    rotatedData[x * height + height - y - 1] = data[x + y * width];
    }

    Donde «anchura» y «altura» son el conjunto de pre-tamaños de la imagen de vista previa utilizando:

    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(width, height);
    camera.setParameters(parameters);

    Usted puede utilizar su girado datos en consecuencia.

    Sólo he utilizado este método para escanear el Código QR y parece que funciona perfectamente. No estoy seguro de cómo es posible que el efecto de otras aplicaciones.

    Esto no funciona, dio un ArrayIndexOutOFBoundsException.
    Mientras que la vista previa de la imagen que recibe coincide con los valores de anchura y altura, a continuación, que no debería estar recibiendo un fuera de juego a la excepción. Este es el código que estoy usando en este momento y funciona muy bien.
    Los datos Raw es conseguir girar bien, pero la calidad de imagen va hacia abajo, después de usar el fragmento de código que no soy capaz de conseguir la adecuada calidad de la imagen de lo que estaba antes, ¿puede usted explicar algunos puntos más en la parte de rotación o puede me ha dado ningún enlace útil para la misma. Su ayuda será muy apreciada.
    Hey Arfin, no he visto ningún cambio en la calidad de la imagen desde el uso de este código. Tal vez hay algo más en su proceso causando el problema? Todo este código está haciendo es mover los píxeles de su posición horizontal a una vertical.
    en primer lugar gracias por responder, supongo que porque no coincide el tamaño de la calidad de la imagen va a la baja después de la rotación, pero como ya se ha explicado tamaño de la vista previa debe ser la misma de lo que exactamente que hemos establecido para la cámara y yo estoy haciendo lo mismo, no sé qué otra cosa va mal den?? ¿Tienes algún tutorial o enlaces en píxeles de la rotación de la parte ??

    OriginalEl autor Scott

Dejar respuesta

Please enter your comment!
Please enter your name here