1

Ich schreibe eine einfache Android-Anwendung, wo ich Frame-Puffer mit ImageReader.OnImageAvailableListener abrufen, um das neueste Bild zu erhalten und die Y-Ebene zu verarbeiten. Ich benutze diese Ebene, um eine einfache Metrik zu berechnen, deren Wert entscheidet, ob ich etwas auf dem Bildschirm zeige oder nicht.Android Camera2 YUV_420_888 Y-Kanal-Interpretation

Meine Frage war, wie man nur die Y-Ebene bearbeitet und interpretiert (ich brauche die U- und V-Ebenen nicht). Nach meinem Verständnis enthält die Y-Ebene den Luminanzkanal; dh. der Kanal mit der Helligkeit des Bildes.

Die Dokumentation besagt, dass jedes Pixel 8 Bits ist, dh ein Byte, was ich für sinnvoll halte, da die Pixel in einem ByteBuffer liegen. Nach einigen Experimenten, die das erste Byte des Y-Kanals drucken (ich mache dies durch Aufruf von Log.i(TAG, String.valueOf(image.getPlanes()[0].getBuffer().get(0) in meinem ImageReader.OnImageAvailableListener), sehe ich keine Korrelation zwischen Bild "Helligkeit" und dem Wert des Bytes. Zum Beispiel, wenn ich die Kamera auf einen komplett schwarzen Hintergrund stelle, bekomme ich Werte von ~ 0 bis 15 für die Luminanz. Wenn ich es auf einen hellen weißen Hintergrund setze, bekomme ich Werte um -110. Diese sind jedoch keine Art von Minima oder Maxima; Ich werde Werte erhalten, die nicht mit der Luminanz zu korrelieren scheinen, wenn sie nicht ganz weiß oder ganz schwarz sind.

Meine Frage ist, wie sollen diese Luminanzwerte interpretiert werden, und sind sie in irgendeiner Weise mit der Helligkeit des Bildes in einem bestimmten Pixel korreliert? Locke ich die Luminanzwerte für den Framepuffer korrekt ab, und wenn nicht, wie sollte man sie abrufen?

+0

In Verbindung stehend: http://stackoverflow.com/questions/22793155/difference-between-yuv420-and-yuv422 –

Antwort

0

Ich fand es schließlich nach viel Hand-wringing heraus: Ich stolperte auf den Schlüssel zur Antwort auf this Verbindung. Die Werte, die gemeldet werden, sind tatsächlich die Luminanzwerte, aber der ByteBuffer, in dem sie platziert werden, ist SIGNED, während die Luminanzwerte UNSIGNED sind (wie in der Verbindung berichtet). Daher sollte jeder Wert aus dem Puffer & -ed mit 0xff sein, um den wahren Luminanzwert abzurufen, der diesmal sinnvoll ist.