2016-08-18 3 views
2

J'ai configuré mon code afin d'obtenir un flux de YUV_420_888 trames de la caméra de mon appareil en utilisant un objet imageReader et le reste de l'API camera2 bien connue. Maintenant, j'ai besoin de transformer ces images au format de pixel NV21 et appeler une fonction native qui attend une image dans ce format pour effectuer certains calculs. Voici le code que je utilise dans le rappel de ImageReader pour réorganiser les octets de la trame:Transformation incorrecte de trames du format YUV_420_888 en NV21 dans un lecteur d'image

 ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader mReader) { 
       Image image = null; 
       image = mReader.acquireLatestImage(); 
       if (image == null) { 
        return; 
       }       

       byte[] bytes = convertYUV420ToNV21(image); 

       nativeVideoFrame(bytes); 
       image.close(); 
      } 
     }; 

private byte[] convertYUV420ToNV21(Image imgYUV420) { 

    byte[] rez; 

    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer(); 
    ByteBuffer buffer1 = imgYUV420.getPlanes()[1].getBuffer(); 
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer(); 

    int buffer0_size = buffer0.remaining(); 
    int buffer1_size = buffer1.remaining(); 
    int buffer2_size = buffer2.remaining(); 

    byte[] buffer0_byte = new byte[buffer0_size]; 
    byte[] buffer1_byte = new byte[buffer1_size]; 
    byte[] buffer2_byte = new byte[buffer2_size]; 
    buffer0.get(buffer0_byte, 0, buffer0_size); 
    buffer1.get(buffer1_byte, 0, buffer1_size); 
    buffer2.get(buffer2_byte, 0, buffer2_size); 


    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    try { 
     outputStream.write(buffer0_byte); 
     outputStream.write(buffer1_byte); 
     outputStream.write(buffer2_byte); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    rez = outputStream.toByteArray(); 

    return rez; 
} 

Mais je ne sais pas pourquoi, la dans le sens horizontal cadre résultant est « renversé ». En d'autres termes, lorsque je déplace l'appareil photo vers la droite, le cadre après la procédure d'emballage que j'ai décrit se déplace vers la gauche, comme si le capteur était placé dans une position antinaturelle.

J'espère que vous pouvez comprendre ce que je veux dire

Merci,

JM

+1

Les couleurs bleu et rouge sont permutées, après 'convertYUV420ToNV21' et' compressToJpeg'. –

+0

@VladimirKulyk lors de l'écriture dans le flux de sortie, re-commander à 0/2/1 pour échanger Blue & Red – AngeloS

Répondre

0

Il est ok pour appareil photo pour produire l'image en miroir. Si vous ne voulez pas qu'il soit mis en miroir, vous devez effectuer une mise en miroir horizontale en échangeant des pixels sur chaque ligne.

+0

Vous économisez ma journée. C'était l'indice que je cherchais – user3417052