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%
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.
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
gespeichertEs 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.
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%Tags und Links c++ opencv windows video-streaming