2016-10-24 3 views
0

Ich möchte einige Imageprocessing auf einem YUV_420_888 Image machen und brauche dafür eine Graustufen-Edition. Wenn ich über das YUV-Bild lese, sollte es ausreichen, um die Y-Ebene des Bildes zu extrahieren. In Android werde ich das mit diesem Workflow versuchen, die Y-Ebene in ein Byte-Array umzuwandeln.YUV-Bild in Graustufenbild umwandeln - Gleiches Ergebnis wie RGB in Graustufen?

Image.Plane Y = img.getPlanes()[0]; 
ByteBuffer byteBuffer = Y.getBuffer(); 
byte[] data = new byte[byteBuffer.remaining()]; 
byteBuffer.get(data); 

So wie ich dieses Bild, das ich jetzt mit einem anderen Graustufenbild erhalten vergleichen möchten (oder zumindest ein Ergebnis der Bildverarbeitung) ich die Frage haben, ist das Graustufenbild ich die Y-Ebene erhalten Extrahieren fast das gleiche wie ein RGB, das in Graustufen umgewandelt wurde? Oder muss ich dafür ein paar zusätzliche Verarbeitungsschritte machen?

Antwort

1

Ja, die data, die Sie von der Y-Ebene erhalten, sollte die gleiche sein, als wenn Sie ein RGB-Bild durchlaufen.

1

Nein, ich verwende den IR-Sensor, in dem ich ein YUV_420_888-Bild bekomme, das bereits Graustufen ist. Aber um es in Bytes umzuwandeln benutzte ich folgende Funktion, die mir einen Fehler gab. Gemäß Ihrer Antwort habe ich nur Y-Flugzeug genommen, und am Ergebnis hat es mir grünen Bildschirm gegeben.

ByteBuffer[] buffer = new ByteBuffer[1]; 

      Image image = reader.acquireNextImage(); 
      buffer[0] = image.getPlanes()[0].getBuffer().duplicate(); 
      //buffer[1] = image.getPlanes()[1].getBuffer().duplicate(); 

      int buffer0_size = buffer[0].remaining(); 
      //int buffer1_size = buffer[1].remaining(); 

      buffer[0].clear(); 
      //buffer[1].clear(); 

      byte[] buffer0_byte = new byte[buffer0_size]; 
      //byte[] buffer1_byte = new byte[buffer1_size]; 

      buffer[0].get(buffer0_byte, 0, buffer0_size); 
      //buffer[1].get(buffer1_byte, 0, buffer1_size); 

      byte[] byte2 = buffer0_byte; 
      //byte2=buffer0_byte; 
      //byte2[1]=buffer1_byte; 
      image.close(); 
      mArrayImageBuffer.add(byte2); 

Nachdem die Bytes dequeing und geht an funcion:

public static byte[] convertYUV420ToNV12(byte[] byteBuffers){ 
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    try { 
     outputStream.write(byteBuffers); 
     //outputStream.write(byteBuffers[1]); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // outputStream.write(buffer2_byte); 

    byte[] rez = outputStream.toByteArray(); 
    return rez; 
} 
Verwandte Themen