Konvertieren von YUV in BGR oder RGB in OpenCV

8

Ich habe eine TV-Capture-Karte mit einem Feed im YUV-Format. Ich habe andere Beiträge gesehen, die dieser Frage ähnlich sind, und habe versucht, jede mögliche Methode auszuprobieren, aber keine von ihnen lieferte ein klares Bild. Im Moment waren die besten Ergebnisse mit dem Funktionsaufruf OpenCV cvCvtColor(scr, dst, CV_YUV2BGR) .

Ich bin mir im Moment des YUV-Formats nicht bewusst, und um ehrlich zu sein, verwirrt mich ein bisschen, weil es aussieht, als ob es 4 Kanäle speichert, aber nur 3? Ich habe ein Bild von der Aufnahmekarte eingefügt, um zu hoffen, dass jemand verstehen kann, was möglicherweise vor sich geht, um die Lücken zu füllen.

Der Feed kommt über eine DeckLink Intensity Pro-Karte herein und wird in einer C ++ - Anwendung unter Verwendung von OpenCV in einer Windows 7-Umgebung aufgerufen.

Aktualisieren

Ich habe einen Wikipedia-Artikel zu dieser Information angeschaut und versucht, die Formel in meiner Anwendung zu verwenden. Darunter befindet sich der Codeblock mit dem von ihm empfangenen Ausgang. Jeder Rat wird sehr geschätzt.

%Vor%

    
Seb 31.10.2011, 13:30
quelle

5 Antworten

5

Es sieht so aus, als würden Sie einen YUV422-Stream als YUV444 dekodieren. Versuchen Sie diese Änderung an dem von Ihnen bereitgestellten Code:

%Vor%

Ich bin mir nicht sicher, ob Sie Ihre Konstanten korrekt haben, aber im schlimmsten Fall sind Ihre Farben aus - das Bild sollte erkennbar sein.

    
Mark Ransom 31.10.2011, 20:46
quelle
6

In der neueren Version von OPENCV gibt es eine eingebaute Funktion, die benutzt werden kann, um YUV to RGB conversion

zu machen

cvtColor(src,dst,CV_YUV2BGR_YUY2);

Geben Sie das YUV -Format nach dem Unterstrich an, z. B. CV_YUYV2BGR_xxxx

    
kyencn 18.04.2014 14:57
quelle
2

Die BlackMagic Intensity Software gibt das YUVY 'Format in bmdFormat8BitYUV zurück, so dass 2 Quellpixel zu 4Bytes komprimiert werden - ich glaube nicht, dass cvtColor von openCV damit umgehen kann.

Sie können dies entweder selbst tun oder einfach die Funktion ConvertFrame () der Intensity-Software aufrufen

edit: Y U V wird normalerweise als

gespeichert

Es gibt ein Y (Helligkeit) für jedes Pixel, aber nur ein U und V (Farbe) für jedes andere Pixel in der Reihe.

Also, wenn Daten ein vorzeichenloses Zeichen ist, das auf den Anfang des Speichers zeigt, wie oben gezeigt.

Pixel 1, Y = Daten [0] U = Daten [+1] V = Daten [+3]
Pixel 2, Y = Daten [+2] U = Daten [+1] V = Daten [+3]

Verwenden Sie dann die YUV- & gt; RGB-Koeffizienten, die Sie in Ihrem Beispielcode verwendet haben.

    
Martin Beckett 31.10.2011 20:15
quelle
1

Es mag der falsche Weg sein, aber viele Leute (ich meine Ingenieure) mischen YUV mit YCbCr.

Versuchen Sie

%Vor%

oder CV_YCrCb2RGB oder vielleicht ein exotischerer Typ.

    
Sam 31.10.2011 14:45
quelle
1

Vielleicht ist jemand durch die Farbmodelle YCbCr und YUV verwirrt. Opencv verarbeitet nicht YCbCr . Stattdessen hat es YCrCb und es wurde in opencv genauso implementiert wie YUV .

Aus den opencv-Quellen Ссылка :

%Vor%

Aber es gibt noch etwas zu sagen.
Derzeit gibt es einen Fehler in der Conversion CV_BGR2YUV und CV_RGB2YUV in der OpenCV-Verzweigung 2.4. *.

Gegenwärtig wird diese Formel in der Implementierung verwendet:

%Vor%

Was es sein sollte (nach wikipedia ):

%Vor%

Die Kanäle Rot und Blau sind in der implementierten Formel falsch platziert.

Mögliche Abhilfe um BGR- & gt; YUV zu konvertieren, während der Fehler nicht behoben ist:

%Vor%     
Temak 27.04.2015 08:40
quelle