Inhaltsverzeichnis

Überblick über Ziele und Ansätze zum Kalibrieren einer LED-Wand zur Benutzung in Virtual Production

Virtual Production hat sich in den letzten Jahren durch die fortschreitende Technologie rasch weiterentwickelt. Für den Bereich „In-Camera VFX“ ist neben dem Tracking und der Gameengine, die Verwendung von LED-Wänden die wichtigste Komponente zur Erstellung immersiver Hintergründe und Sets für Film, Fernsehen und andere Medien. Die Qualität der visuellen Effekte und der Erfolg von Virtual Production hängen mit der Qualität der LED-Wände und deren Farbwiedergabe zusammen.

Da es sich bei einer projizierten 3D-Welt auf ein spezifisches Display nicht um die gleichen physikalischen Gegebenheiten des Lichts, wie in der Realität handelt, ist eine besonderer Blick auf die Color-Pipeline zu werfen. Um realistische und ästethische Bilder mit der Kamera zu erzeugen, spielen verschiedene Elemente eine Rolle:

  1. Colormanagement in der Gameengine
  2. Farbkalibrierung der Displayechnologie (LED-Wand)

  3. Colorscience und Charakteristik der Kamera

In jedem Bereich könnte angesetzt werden um die Farbtreue zu erhalten.

Warum ist die Farbe denn überhaupt ein Problem?

Das hat mit der menschlichen Wahrnehmung, der Historie der Displaytechnolgien und den daraus folgenden Kameracharakteristiken digitaler Kameras zu tun.


Allgemein wird zwischen Scene-refered-Farbräumen und Display-referred-Farbräumen unterschieden. Scene-referred Farbräume sind linear und stellen eine 1:1 Relation zum Licht der Szene dar. Display-referred Farbräume sind auf Monitore angepasst. Zu diesen gehören die Standards ITU-R BT.709 (Rec 709) oder auch sRGB.



Game Engines sind dazu gedacht 3D-Inhalte in Echtzeit auf Monitoren darzustellen. Sonst würde das Spielen keine Freude bereiten. Somit geben Gameengines standardmäßig Farben in Display-referred Farbräumen aus. Im Kontext von LED-VP ist das schwierig.

 Kameras nehmen normalerweise eine reale Szene mit linearem Licht auf. Um die Informationen effizienter zu speichern, werden sie logarithmisch kodiert. Denn auch die menschliche Wahrnehmung ist logarithmisch (Weber-Fechner-Gesetz).

Es gibt also zwei Übertragungsfunktionen: Aufnahmeseitig die OETF (opto-electronic transfer function) und Ausgabeseitig die EOTF (electronic-optical transfer function). Unterschiedliche Kameras verwenden unterschiedliche OETF, unterschiedliche Display unterschiedliche EOTF. Werden nun gammakorrigierte Displays erneut mit einer Kamera abgefilmt, kommt es zu einer „doppelten Reise“ durch die Übertragungsfunktionen.

Im Anwendungsfall VP mit In-Camera-VFX nur für die Anteile, die sich auf der LED-Wand befinden, der Vordergrund durchlebt die „normale“ Farbraumwandlung. 

Es ist somit schon zu vermuten, dass sich ein ästhetischer Bildeindruck nicht ohne zusätzliche Anpassungen erreichen lässt.

Wo wird angesetzt?

Ziel ist es, dass eine 3D-Asset genauso wirkt wie dasselbe Element in der Realität. Man könnte überlegen besondere OETF in den Kameras oder andere Colorscience/anderes Demosaicing zu entwickeln. Das ist nicht sinnvoll, da viel zu aufwändig und VP eine zu große Nische im Bereich der Kameraeinsatzmöglichkeiten ist. Außerdem würden Vorteile für die Realitätsabbilding verloren gehen.

Es könnte auch ein Ansatz sein, die Ausgabe in der Gameengine entsprechend anzupassen, um den doppelten Kurven zu entkommen. Doch könnte eine solche Umrechnung gegebenenfalls schwierig zu implementieren sein, oder die Performance beeinflussen. Es ist aber eine gute Möglichkeit.

Des weiteren, könnte die LED Wand entsprechend kalibriert werden:

Zum Einen hinsichtlich einer korrekten Farbraumdarstellung (Dynamikumfang, Primärvalenzen, Gammakurve), mittels physikalischem Messgerät (Spektrometer; Colorimeter). Beispielhaftes Ziel: Ein LIDAR-gescanntes Objekt, soll die gleiche Spektrale Reflektanz aufweisen wie das Reale Objekt. Das ist schwer möglich, da die spektrale Verteilung der LED-Technologie nicht denen der realen Ausleuchtung entspricht.

Zum Anderen kann die LED-Wand mit einer Korrekturmatrix korrigiert werden, dass sie perfekt zur OETF, dem Gammut und der Farbempfindlichkeit der Kamera passt. Dieser Ansatz wurde verfolgt.


Wie geht man dabei vor?

Am Beispiel der Kalibrierung in Unreal Engine

Detailierter nachzulesen in der Unreal-Dokumentation: https://docs.unrealengine.com/4.27/en-US/WorkingWithMedia/IntegratingMedia/InCameraVFX/InCameraVFXCameraCalibration/

Zunächst wird über die Gameengine ein Color-Checker Test-Setting geladen. In diesem Setup wird ein synthetischer Color-Checker integriert. Dort sind durch den verwendeten Farbraum die Farbwerte genau definiert und somit bekannt. Unreal nutzt standardmäßig „linear rec.709“ als Farbraum. Also einen linearen Scene-referred Farbraum mit den Rec.709 Farbprimärvalenzen. Der Industriestandard für einen Arbeitsfarbraum ist aber oftmals z.B. ACEScg, der ermöglicht, die Arbeitsfarbräume verschiedener Software über OCIO configs zu organisieren.

In Unreal wird der gerenderte Inhalt über Display auf einem Ausgabemedium dargestellt. Die OCIO Konfigurationen für Display müssen nach den Bedürfnissen der Produktion angepasst werden.

Zur Erstellung der Korrekturmatrix wird der synthetische Color-Checker in Unreal mit der zu verwendenden Kamera von der LED-Wand abgelichtet. Das erstellte Footage muss zunächst linerarisiert werden, wozu die Inverse Kurve der Kamera (z.B LogC) angewendet wird.

Anhand der Patches auf dem Color-Checker kann die Differenz zum Sollwert berechnet werden. Der Colorchecker stellt die Zielfarbwerte zur Verfügung. Anhand dieser wird die Korrekturmatrix errechnet.

Es handelt sich um eine Pixelweise Korrektur, die Korrektur Matrix ist meistens eine 3×3 Matrix. 
Die Grundlegende Mathematik hinter der Korrekturmatrix:

Die RGB-Werte der abgelichteten Testpatches Rot, Grün und Blau werden in die Matrix geschrieben

Die inverse dieser Matrix wird mit dem höchsten Weißwert (W), auf 1.0 normalisiert Multipliziert. Das ist der Skalierungsfaktor.

I = F^-1 → S = I × W/max(WRGB)

Dieser wird benutzt um um die Faktoren der Matrix zu skalieren. Danach muss diese Matrix invertiert werden:

Kalibrations-Matrix = F^-1

Mit dieser Matrix kann die Ausspielung auf der LED-Wand belegt werden.

In Unreal also:

  1. Zunächst eine Konvertierung vom OCIO-Referenz Farbraum in den Linearen Camera Kalbirerungsfarbraum
  2. die Korrektur Matrix wird angewendet.
  3. Kodierung in den Zielfarbraum der LED-Wand (z.B. PQ)

Wenn die Primärvalenzen übereinstimmen, werden alle Farben innerhalb des aufgespannten Farbraums dargestellt. Natürlich ändert sich dadurch der visuelle Eindruck für das menschliche Auge, welches direkt auf die Wand schaut. Durch die Kamera betrachtet, sind die Änderungen aber der Ausgleich zu den falsch dargestellten Kontrasten und Farben. Diese Charakterisierung ist für jede Kamera individuell zu erstellen. Bei dieser Kalibrierungsart kann die spektrale Limitation der LED-Wand als Lichtquelle nicht berücksichtigt werden. Es geht nur um eine korrekte Darstellung als In-Camera-Hintergrund.

Und an der HdM?

Da die LED-Wand hier an der HdM hauptsächlich für Fernsehen oder Film benutzt wird, kann der Schritt zur Kalibrierung mit einer Gameengine übersprungen werden. Außerdem haben die Panels, bzw die Controller der LED-Panels beider Wände keine Möglichkeit zur Kalibrierung, weshalb dieser Schritt auch wegfällt.

Der Hauptfokus liegt somit auf dem Korrigieren des Bildes für die Kamera. Wie bereits erwähnt, wird dies über ein Testbild berechnet. Daher würde ein Script geschrieben (generate_primaries), welches uns ein Testbild mit den 3 Primaries (Rot, Grün, Blau), Schwarz, mittlerem Grau und Weiß generiert und auf die richtige Größe für die LED-Wand anpasst. Außerdem macht es Sinn noch ein „normales“ Foto als Testbild zu benutzen, da man mit diesem, anhand eines realen Beispiels, am besten überprüfen kann, ob die Farben wieder richtig aussehen.

Das Testpattern und das Testbild wird dann Fullscreen auf einem Laptop angezeigt, welcher per HDMI mit dem Controller für die LED-Wand verbunden ist. Nun fotografiert man beide Bilder mit der gewünschten Kamera ab und speist diese In Matlab ein. Dort wird zuerst mit den Daten aus dem Testpattern gearbeitet. Das Bild wird auf das reine Testpattern gecroppt und die Farbwerte werden aus den einzelnen Patches extrahiert. Dafür müssen die Werte zuerst in den linearen Raum konvertiert werden und mit dem median wird dann der mittlere Farbwert bestimmt. Mit diesen Werten wird dann eine Farbmatrix berechnet, welche die Differenzwerte von der LED-Wand und der Kamera enthält. Daraufhin werden die beiden aufgenommenen Bilder mit der Matrix multipliziert und wieder von linear zu sRGB konvertiert und sinnvoll skaliert.

Nun können die Bilder miteinander verglichen werden, um zu überprüfen, ob die Kalibrierung funktioniert hat. Dafür gibt das Skript einem 3 Fenster aus, welche die Patches des Testpatterns und das Testbild in allen Schritten zeigt. Außerdem werden die Werte der einzelnen Patches in der Konsole ausgegeben (Benamung, Rot-Kanal, Grün-Kanal, Blau-Kanal). Ist man mit dem Ergebnis zufrieden, kann man das „vorkorregierte“ Bild auf der LED-Wand anzeigen, welches als extra Datei berechnet wurde. Nun müsste das Bild mit der Kamera abgefilmt genau so aussehen, wie gewünscht.

Im letzten Teil des Skripts werden noch die Ergebnisse verglichen. Zu erst kommt das abfotographierte Bild ohne vorher angewendetet Korrektur, dann mit und dann das Original mit einem einfachen Gaussblur um die Bilder vergleichbarer zu machen. Obwohl das Ergenis nicht perfekt ist, ist ersichtlich, dass man auch schon mit einer simplen linearen Matrixkorrektur deutlich akkuratere Farben erreichen kann.

Wie geht man konkret vor?

Was benötigt wird:

  1. Laptop an LED-Wand anschließen und verifizieren, dass die erwartete Transferkurve übertragen wird (zB. mit einem Spektrometer)
  2. Testpattern aus Github auf der LED-Wand ausgeben
  3. Kamera so weit entfernt platzieren, dass die einzelnen Pixel nicht mehr sichtbar sind
  4. Weißabgleich auf die Wand anpassen (im Normalfall 6500k), mit manuellem Fokus leicht unscharf stellen (um Aliasing und andere Artefakte zu vermeiden), auf das mittlere Grau belichten und ein Foto machen. Diesen Vorgang mit dem anderen Testbild wiederholen
  5. Bilder auf dem Laptop im Ordner „data/images“ ablegen und die Bennenung im Matlabscript unter „captured_testpattern“ und „captured_Landscape“ ändern
  6. Das Programm ausführen und mit der Maus eine rechteckige Auswahl um das Testpattern ziehen und mit Rechtsklick „crop image“ zu croppen. Mit dem Testbild wiederholen.
  7. In den Vergleichsfenstern die Ergebnisse anschauen und Resultate bewerten
  8. Das korregierte Bild für die Wand liegt nun im Ordner „output/precorrected_images“
  9. Unter „Compare Results“ können die Ergebnisse (Aufnahmen von der korrigierten/nicht korrigierten Wand) zusätzlich noch geladen und verglichen werden.