Konvertierung von YUV in BGR oder RGB in OpenCV
Ich habe eine TV-capture-Karte, die eine Einspeisung in ein YUV-format. Ich habe gesehen, andere Beiträge hier ähnlich zu dieser Frage und versucht jede mögliche Methode angegeben, aber keiner von Ihnen vorausgesetzt, ein klares Bild. Im moment die besten Ergebnisse wurden mit der OpenCV cvCvtColor(scr, dst, CV_YUV2BGR)
Aufruf der Funktion.
Ich bin derzeit unwissend, YUV-format, und um ehrlich zu sein verwirrt mich ein bisschen, wie es aussieht speichert er 4 Kanäle, aber nur 3? Ich habe ein Bild von der capture-Karte zu hoffen, dass jemand nachvollziehen kann, was möglicherweise passiert, die ich verwenden könnte, um die Lücken zu füllen.
Ist das Futter kommt durch eine DeckLink Intensity Pro Karte und zugegriffen, die in einer C++ - Anwendung mit OpenCV in einer Windows 7 Umgebung.
Update
Ich habe mir bei einem wikipedia-Artikel in Bezug auf diese Informationen und versucht, die Formel zu verwenden in meiner Anwendung. Unten ist der code-block mit der Ausgabe von ihm erhalten. Jede Beratung wird sehr geschätzt.
BYTE* pData;
videoFrame->GetBytes((void**)&pData);
m_nFrames++;
printf("Num Frames executed: %d\n", m_nFrames);
for(int i = 0; i < 1280 * 720 * 3; i=i+3)
{
m_RGB->imageData[i] = pData[i] + pData[i+2]*((1 - 0.299)/0.615);
m_RGB->imageData[i+1] = pData[i] - pData[i+1]*((0.114*(1-0.114))/(0.436*0.587)) - pData[i+2]*((0.299*(1 - 0.299))/(0.615*0.587));
m_RGB->imageData[i+2] = pData[i] + pData[i+1]*((1 - 0.114)/0.436);
}
- "Ich bin derzeit nicht bewusst das YUV-format" --> Wikipedia. Lesen Sie dazu: en.wikipedia.org/wiki/YUV#Conversion_to.2Ffrom_RGB
- Vielen Dank für die Verlinkung, der Artikel, aber ich bin dann davon ausgegangen, dass ich die Arbeit mit einem y, u, v und y1, und mit diesen Variablen, die zur Erstellung einer RGB-äquivalent? Auch würde ich erstellen 4 verschiedenen arrays zu nehmen, in jedem einzelnen Satz von Werten zu verschmelzen Sie alle zusammen?
- Sie brauchen nur 3 arrays, da gibt es 3 Farbkomponenten im RGB-Farbraum. Aber ja, im Grunde muss man zum berechnen der Farbe, die Komponenten einzeln und speichern Sie Sie irgendwo.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es für mich so, du bist der Dekodierung einer YUV422-stream als YUV444. Versuchen Sie diese änderung auf den code, den Sie zur Verfügung gestellt:
Ich bin mir nicht sicher, du hast deine Konstanten zu korrigieren, aber im schlimmsten Fall Ihre Farben werden aus - das Bild sollte erkennbar sein.
In einer neueren version von
OPENCV
es ist eine integrierte Funktion kann verwendet werden, umYUV
zuRGB
KonvertierungcvtColor(src,dst,CV_YUV2BGR_YUY2);
geben Sie die
YUV
format nach dem Unterstrich, wie dieseCV_YUYV2BGR_xxxx
Die BlackMagic Intensity die software-return-YUVY' - format in bmdFormat8BitYUV, also 2 Quellen Bildpunkte in 4bytes - ich glaube nicht, dass openCV ist cvtColor kann damit umgehen.
Können Sie entweder tun es sich selbst an, oder rufen Sie die Intensitäts-software ConvertFrame () - Funktion
edit: Y-U-V ist normalerweise gespeichert
Gibt es ein Y (Helligkeit) für jedes pixel, sondern nur eine U-und V - (Farbe) für jeden zweiten pixel in der Zeile.
Also wenn man die Daten in ein unsigned char, deutete auf den Anfang des Speichers wie oben dargestellt.
pixel 1, Y = data[0] U = Daten[+1] V = Daten[+3]
pixel 2, Y = data[+2] U = Daten[+1] V = Daten[+3]
Dann verwenden Sie den YUV->RGB-Koeffizienten, die du in deinem Beispiel-code.
Verwende ich die folgende C++ - code verwenden OpenCV, um konvertieren yuv-Daten (YUV_NV21) rgb-Bild (BGR in OpenCV)
und das konvertierte Ergebnis ist, wie das Bild yuv.png.
finden Sie die Test-raw-Bild von hier und das ganze Projekt von meinem Github-Projekt
Kann es sein das der falsche Weg, aber viele Leute (ich meine, Ingenieure) do-mix-Format mit YUV-YCbCr.
Versuchen
oder CV_YCrCb2RGB oder vielleicht ein exotischer Typ.
Vielleicht jemand verwirrt ist, durch die Farbmodelle YCbCr und YUV.
Opencv ist nicht in der Lage YCbCr. Stattdessen hat er YCrCb, und es implementiert die gleiche Weise wie YUV in opencv.
Aus der opencv Quellen https://github.com/Itseez/opencv/blob/2.4/modules/imgproc/src/color.cpp#L3830:
Aber es gibt eine weitere Sache zu sagen.
Derzeit gibt es eine bug in der Umwandlung CV_BGR2YUV und CV_RGB2YUV in OpenCV Filiale 2.4.* .
In dieser Formel verwendet wird, in Umsetzung:
Was es sein sollte (nach wikipedia):
Die Kanäle Rot und Blau sind verlegt in der implementierten Formel.
Möglich Abhilfe zu konvertieren BGR->YUV auch wenn der Fehler nicht behoben ist :