2016-05-05 21 views
1

Ich versucheOpenCV imshow Y aus YUV

zu extrahieren und Anzeige

Y-Kanal von YUV umgewandelt Bild

Mein Code ist wie folgt:

Mat src, src_resized, src_gray; 

src = imread("11.jpg", 1); 

resize(src, src_resized, cvSize(400, 320)); 

cvtColor(src_resized, src_resized, cv::COLOR_BGR2RGB); 

/* 
I've tried both with and without the upper conversion 
(mentioned here as bug 
http://stackoverflow.com/questions/7954416/converting-yuv-into-bgr-or-rgb-in-opencv 
in an opencv 2.4.* version - mine is 2.4.10) 
*/ 

cvtColor(src_resized, src_gray, CV_RGB2YUV); //YCrCb 

vector<Mat> yuv_planes(3); 
split(src_gray,yuv_planes); 

Mat g, fin_img; 

g = Mat::zeros(Size(src_gray.cols, src_gray.rows),0); 

// same result withg = Mat::zeros(Size(src_gray.cols, src_gray.rows), CV_8UC1); 

vector<Mat> channels; 

channels.push_back(yuv_planes[0]); 
channels.push_back(g); 
channels.push_back(g); 

merge(channels, fin_img); 

imshow("Y ", fin_img); 

waitKey(0); 

return 0; 

Als Ergebnis Ich erwartete ein Grau Bild zeigt Lumineszenz.

Stattdessen werde ich ein B/G/R-Kanal-Bild in Abhängigkeit von der Position des (ersten/zweiten/dritten)

channels.push_back(yuv_planes[0]); 

wie hier gezeigt: Result

Was bin ich? (Ich plane, die Luminanz zu verwenden, um eine Summe von Zeilen/Spalten zu erstellen und das Nummernschild später unter Verwendung der erhaltenen Daten zu extrahieren)

+0

Könnten Sie bitte, Sie Code in einer vernünftigen Art und Weise einrücken? –

+0

"Stattdessen erhalte ich ein B/G/R-Kanalbild" - aber Sie erstellen explizit ein 3-Kanal-Bild, bei dem Sie einen Farbkanal auf Luminanz und die anderen 2 auf Null setzen. Was erwarten Sie sonst noch als eine rote, grüne oder blaue Farbe? Wenn Sie es in Graustufen haben wollen, haben Sie entweder ein einzelnes Kanalbild oder setzen alle 3 Komponenten von RGB auf die gleichen Werte. –

+0

Nun, das war schrecklich dumm und einfach. Danke vielmals. – Whatever

Antwort

1

Das Problem bestand darin, die Lumineszenz nur in einem Kanal anzuzeigen, anstatt alle Kanäle damit zu füllen.

Wenn jemand anderes trifft das gleiche Problem nur

ändern
Mat g, fin_img; 

g = Mat::zeros(Size(src_gray.cols, src_gray.rows),0); 

vector<Mat> channels; 

channels.push_back(yuv_planes[0]); 
channels.push_back(g); 
channels.push_back(g); 

zu (füllen Sie alle Kanäle mit den gewünschten Kanal)

Mat fin_img; 

vector<Mat> channels; 

channels.push_back(yuv_planes[0]); 
channels.push_back(yuv_planes[0]); 
channels.push_back(yuv_planes[0]);