Bilddaten von Android camera2 API auf Galaxy S5 gewendet und zerquetscht

8

Ich implementiere eine App, die Echtzeit-Bildverarbeitung auf Live-Bildern von der Kamera verwendet. Es funktionierte, mit Einschränkungen, die jetzt veraltete android.hardware.Camera; für verbesserte Flexibilität & amp; Leistung Ich möchte die neue android.hardware.camera2 API verwenden. Ich habe jedoch Probleme, die Rohbilddaten zur Verarbeitung zu bekommen. Dies ist auf einem Samsung Galaxy S5. (Leider habe ich kein anderes Lollipop-Gerät zum Testen auf anderer Hardware.)

Ich habe das gesamte Framework (mit Inspiration aus den 'HdrViewFinder' und 'Camera2Basic' Samples) bearbeitet und das Livebild wird über eine SurfaceTexture und eine GLSurfaceView auf dem Bildschirm gezeichnet. Allerdings muss ich auch auf die Bilddaten zugreifen (Graustufen ist in Ordnung, zumindest für den Moment) für benutzerdefinierte Bildverarbeitung. Laut der Dokumentation zu StreamConfigurationMap .isOutputSupportedFor (class) wäre die empfohlene Oberfläche, um Bilddaten direkt zu erhalten, ImageReader (richtig?).

Also habe ich meine Capture-Anfragen wie folgt eingerichtet:

%Vor%

und im OnImageAvailable-Callback für den ImageReader greife ich wie folgt auf die Daten zu:

%Vor%

... aber während (wie gesagt) die Livebild-Vorschau funktioniert, stimmt etwas nicht mit den Daten, die ich hier bekomme (oder mit der Art, wie ich es bekomme). Laut

%Vor%

... die folgenden ImageFormats sollten unterstützt werden: NV21, JPEG, YV12, YUV_420_888. Ich habe alles versucht (oben für 'Format' gesteckt), alle unterstützen die eingestellte Auflösung nach getOutputSizes(format) , aber keiner von ihnen gibt das gewünschte Ergebnis:

  • NV21: ImageReader.newInstance löst java.lang.IllegalArgumentException aus: Das NV21-Format wird nicht unterstützt
  • JPEG: Das funktioniert, aber es scheint nicht sinnvoll zu sein, dass eine Echtzeit-Anwendung für jedes Bild JPEG-Kodierung und -Dekodierung durchläuft ...
  • YV12 und YUV_420_888: Das ist das seltsamste Ergebnis - ich kann sehen, das Graustufenbild, aber es ist vertikal gedreht (ja, umgedreht, nicht gedreht!) und signifikant gequetscht (horizontal stark skaliert, aber nicht vertikal).

Was fehlt mir hier? Was bewirkt, dass das Bild gewendet und zerquetscht wird? Wie kann ich einen geometrisch korrekten Graustufenpuffer erhalten? Sollte ich eine andere Art von Oberfläche (anstelle von ImageReader) verwenden?

Irgendwelche Hinweise geschätzt.

    
Steffen G. 04.03.2015, 01:36
quelle

2 Antworten

4

Ich fand eine Erklärung (obwohl nicht unbedingt eine befriedigende Lösung): Es stellt sich heraus, dass das Seitenverhältnis des Sensor-Arrays 16: 9 ist (gefunden über mCameraInfo.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); ).

Zumindest beim Anfordern von YV12 / YUV_420_888 scheint der Streamer das Bild nicht zu beschneiden, sondern skaliert es ungleichmäßig, um die gewünschte Bildgröße zu erreichen. Die Bilder haben die richtigen Proportionen, wenn sie ein 16: 9-Format anfordern (von denen es leider nur zwei Bilder mit höherer Auflösung gibt). Scheint ein bisschen seltsam für mich - es scheint nicht zu passieren, wenn Sie JPEG anfordern, oder mit den entsprechenden alten Kamera-API-Funktionen, oder für Standbilder; und ich bin mir nicht sicher, wofür die nicht einheitlich skalierten Frames gut wären.

Ich finde, dass es keine wirklich befriedigende Lösung ist, weil Sie sich nicht auf die Liste der Ausgabeformate verlassen können, sondern erst die Sensorgröße finden, Formate mit dem gleichen Seitenverhältnis finden und dann die Auflösung neu berechnen müssen Bild selbst (wie benötigt) ...

Ich weiß nicht, ob dies hier das erwartete Ergebnis ist oder ein 'Merkmal' der S5. Kommentare oder Vorschläge sind immer noch willkommen.

    
Steffen G. 08.03.2015, 20:05
quelle
0

Ich hatte das gleiche Problem und habe eine Lösung gefunden. Der erste Teil des Problems ist die Größe des Oberflächenpuffers:

%Vor%

Hier wird das Bild verzerrt, nicht in der Kamera. Sie sollten es auskommentieren und dann eine Skalierung des Bildes beim Anzeigen einstellen.

%Vor%

Sie können mit den Werten herumspielen, um die Lösung für Ihr Problem zu optimieren.

    
Lyubomir Dinchev 18.07.2016 10:19
quelle