Konvertierung von YUV in RGB durch Fragment-Shader

8

Ich habe ein Problem mit der Umwandlung der Kameravorschau in Android vom YUV-Format in RGB. Der Zweck der Konvertierung besteht darin, einige Effekte anzuwenden. Ich versuche, durch Fragment-Shader zu konvertieren, weil die Konvertierung durch systemeigenen Code langsam ist (ca. 14fps). Die Referenz, die ich verwendet habe, ist Ссылка . Ich versuche, diesen Code auf Android-Plattform zu portieren, aber das Ergebnis sind schwarz-grüne Rechtecke. Aber ich kann etwas Form durch die Ausgabe sehen, die ich bekomme. Könnten Sie mir bitte helfen, dieses Problem zu lösen? Ich glaube, das ist ein beliebtes Problem: Effekte auf die Kameravorschau anwenden. Ich gebe auch einen Link zu meinem Projekt zum Testen: Ссылка . Vielen Dank.
AKTUALISIERT:
Dies ist meine Methode onPreviewFrame :

%Vor%

So binde ich Byte-Arrays an die OpenGL-Textur in onDrawFrame -Methode:

%Vor%

Und das ist mein Fragment-Shader-Code:

%Vor%     
anyoneguy 26.08.2012, 14:10
quelle

5 Antworten

3

Ich bin mir nicht sicher, ob Sie das Problem bereits behoben haben. Meine Antwort

  1. Standardmäßig ist die Kamera-Ausgabe NV12, aber im Fragment-Shader YUV bis RGB verwenden Sie YV12 - & gt; RGB. Du wirst es tun müssen setPreviewFormat(ImageFormat.YV12); , oder benutze einen anderen Shader
  2. Es gibt 3 Texturen, stellen Sie sicher, dass Sie

    tun

    GLES20.glActiveTexture(GLES20.GL_TEXTURE2); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, muTextureName)

    vor dem Aufruf eines beliebigen glTexImage2D. und glTexSubImage2D

  3. Sie können glTexSubImage2D auch einmal mit jedem frame und glTexImage2D verwenden.

  4. Größe von U und V ist gleich, zumindest für YV12,

    System.arraycopy(data, U_INDEX, uData, 0, LENGTH_4 * 2);

    sollte sein %Code%  Ändern Sie die Größe entsprechend im Code.

psharma 18.12.2012, 16:41
quelle
2

Ich weiß nicht, ob Sie Ihr Problem gelöst haben.

Ich habe deinen Code benutzt und in diesem Modus gelöst.

%Vor%

}

    
ZanoOnStack 12.07.2013 13:10
quelle
1

Schließlich hat Ihr Projekt eine Kameravorschau angezeigt. Ich habe 2 Probleme gefunden: 1. Vor dem Binden und Ändern der Oberflächeneigenschaften müssen Sie GLES20.glActiveTexture (GLES20.surfacenummer) aufrufen; 2. Wichtigeres und verstecktes Problem ist das GLES20.glTexImage2D () funktioniert nicht mit Breite und Höhe, die keine Potenz von 2 Zahlen sind. Nachdem Sie die Textur mit der Größe 1024X1024 geladen haben, sollten Sie GLES20.glTexSubImage2D ()

aufrufen

Viel Glück!

    
bahakz 04.03.2013 19:05
quelle
1

Verwenden Sie für die schnellste und optimalste Methode die allgemeine GL-Erweiterung

%Vor%

Als in Java

%Vor%

In Java GL Thread

%Vor%

Die Farbkonvertierung ist bereits für Sie erledigt. Sie können tun, was immer Sie möchten, direkt im Fragment-Shader.

Hoffe, dass Sie in Ihrer Recherche etwas Zeit sparen.

    
fky 19.03.2014 13:06
quelle
0

Ich habe die Lösungsform Wie man das Android-YUV-NV21-Kamerabild auf dem Hintergrund in libgdx mit OpenGLES 2.0 in Echtzeit rendert? zu dem in der Frage geteilten Projekt und bekam ein funktionierendes Projekt. Wenn Sie wie ich nach Tutorial-Code suchen, der YUV-RGB-Konvertierung durch Fragment-Shader durchführt, können Sie einfach die folgenden Schritte ausführen, um ein funktionierendes Beispiel zu erhalten.

  1. Laden Sie das Projekt Ссылка herunter und entpacken Sie es.
  2. Ersetzen Sie die Datei GLRenderer.java und res / raw / f_convert.glsl vollständig durch den unten angegebenen Code.
  3. Öffnen Sie das Projekt in Eclipse oder Importieren Sie das Projekt in Android Studio .

Die wichtigsten Punkte des Codes in der Frage sind:

  1. ohne GLES20.glActiveTexture (GLES20.GL_TEXTURE1); , yBuffer wird nicht an GL übergeben.
  2. Die YUV-Daten nehmen das YUV-NV21-Format an und u_texture und v_texture wurden nicht korrekt übergeben und im Shader verarbeitet. Siehe diesen Beitrag für weitere Informationen.

Nun der korrigierte Code: Ersetzen Sie bitte GLRenderer.java durch

%Vor%

und ersetzen Sie f_convert.glsl durch

%Vor%     
Peter 19.10.2016 09:55
quelle