camera2 api wandeln yuv420 in rgb grün um

8

ich versuche, Bild von YUV_420_888 zu rgb zu konvertieren, und ich habe einige Probleme mit dem Ausgabebild. In ImageReader erhalte ich ein Bild im Format YUV_420_888 (mit Kamera 2 api für diese Bildvorschau).

%Vor%

In android SDK für YuvImage Klasse schreiben, dass YuvImage nur mit NV21, YUY2.

da wir den Unterschied zwischen N21 und yuv420 nicht groß sehen können und versuche, Daten in N21 zu konvertieren

YUV420:

und N21:

in onImageAvailable bekomme ich separat alle Planes und lege sie an den richtigen Platz (wie auf dem Bild)

%Vor%

nach dem Erstellen von YuvImage, umwandeln in Bitmap, anzeigen und speichern

%Vor%

aber mein gespeichertes Bild ist grün und pink:

Was habe ich vermisst?

    
mr.leo 05.11.2015, 10:53
quelle

4 Antworten

3

Beim Konvertierungsversuch gibt es zwei Hauptprobleme:

  1. Wir können nicht davon ausgehen, dass die U- und V-Ebenen isoliert sind, sie könnten verschachtelte Daten enthalten (z. B. U-PLANE = {U1, V1, U2, V2, ...} ). Tatsächlich könnte es sogar ein NV21-Interleaving sein. Der Schlüssel hier ist der Zeilenschritt und Pixelschritt und überprüfe auch, was wir von YUV_420_888 Format .
  2. Die Tatsache, dass Sie angegeben haben, dass die meisten Daten der U an V-Ebenen Nullen sind, zeigt an, dass Sie eine Android Fehler bei der Generierung von Bildern in YUV_420_888 . Dies bedeutet, dass selbst wenn Sie das Umwandlungsrecht erhalten, das Bild immer noch grün aussieht, wenn Sie von dem Fehler betroffen sind, der nur bei Android 5.1.1 und höher behoben wurde. Es lohnt sich also zu prüfen, welche Version Sie verwenden den Code reparieren.
silvaren 09.11.2015 03:29
quelle
3

Ich habe die YUV_420-Logik (genau wie im obigen Diagramm gezeigt) in RenderScript implementiert, siehe vollständigen Code hier:

Konvertierung von YUV_420 _888 in Bitmap, vollständiger Code

Es produziert perfekte Bimaps für API 22, aber für API 21 zeigt es die "grüne Idylle". Von diesem kann ich bestätigen, die Ergebnisse, die Sie gefunden haben. Wie bereits oben von Silvaren erwähnt, scheint der Grund ein Android-Fehler in API 21 zu sein. Wenn ich meinen RS-Code betrachte, ist klar, dass wenn die U- und V-Information fehlt (dh Null), die G (reen) ARGB-Komponente sehr groß wird die Umwandlung.

Ich sehe ähnliche grüne Bilder auf meinem Galaxy S5 (immernoch API 21) - hier sogar kopfüber ;-). Ich vermute, dass die meisten Geräte auf API 21 derzeit Camera2 noch nicht für ihre Gerätekamera-Apps verwenden. Es gibt eine kostenlose App namens "Manual Camera Compatibility", die es erlaubt, dies zu testen. Daraus ersehe ich, dass die S5 / API21 in der Tat immer noch nicht Camera2 nutzt ... zum Glück nicht ...

    
Settembrini 14.03.2016 20:49
quelle
2

bufferV.get(data2) erhöht die Position des ByteBuffers. Deshalb erzeugt die Schleife for (int i=0;i<bufferV.remaining();i++) 0 Iterationen. Sie können es einfach als

umschreiben %Vor%     
Alex Cohn 05.11.2015 11:53
quelle
2

Ich habe ein Bild von ImageFormat.YUV_420_888 erhalten und konnte erfolgreich in JPEG-Datei speichern, und konnte es in Windows korrekt anzeigen.
Ich teile hier:

%Vor%     
jaehyek 02.08.2017 14:13
quelle

Tags und Links