2016-06-19 19 views
1

Zeit, was auf meinem Ansichtsfenster ist:glReadPixels funktioniert nicht mit nicht-quadratischen Breite und Höhe?

enter image description here

Hier meine Exportbild Methode.

void exportImage() 
{ 
    int width = 200; 
    int height = 100; 
    GLubyte *data = new GLubyte[4*width*height]; 
    glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE, data); 
    cv::Mat imageMat(width, height, CV_8UC4, data); 
    cv::flip(imageMat, imageMat, 0); 
    cv::imwrite("ok.jpg",imageMat); 
} 

Bei Verwendung 800x800,

enter image description here

Bei Verwendung 200x200,

enter image description here

Aber wenn Gebrauch 200x100, (bitte gelb immer blau nichts ausmacht)

void exportImage() 
{ 
    int width = 200; 
    int height = 100; 
    GLubyte *data = new GLubyte[4*width*height]; 
    glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE, data); 
    cv::Mat imageMat(width, height, CV_8UC4, data); 
    cv::flip(imageMat, imageMat, 0); 
    cv::imwrite("ok.jpg",imageMat); 
} 

enter image description here

Zunächst Breite wurde Höhe, und das Bild ist falsch. Es sieht aus wie Array-Index-Verschiebung Problem, aber ich konnte nicht verstehen, warum, weil die Zuordnung abhängig von der Breite und Höhe auch nach dem Code ändern sollte.

Als ich versuchte, Swapping Breite und Höhe in glReadPixels:

void exportImage() 
{ 
    int width = 200; 
    int height = 100; 
    GLubyte *data = new GLubyte[4*width*height]; 
    glReadPixels(0,0,height,width,GL_RGBA,GL_UNSIGNED_BYTE, data); 
    cv::Mat imageMat(width, height, CV_8UC4, data); 
    cv::flip(imageMat, imageMat, 0); 
    cv::imwrite("ok.jpg",imageMat); 
} 

enter image description here

Das Bild sieht richtig? Aber die Breite und Höhe noch ausgetauscht?

+0

Sie sagen, "180x200", aber der Screenshot sagt "190x200". Was ist damit? –

+0

Oh, es ist ein Tipp. Die Informationen im Screenshot sind korrekt. – 5argon

+0

Moment mal, ich habe tatsächlich 190 in die "Höhe" gesetzt aber warum ist es so weit gekommen ..? Vielleicht ist das das Problem. – 5argon

Antwort

0

Ok, ich habe einen sehr dummen Fehler gemacht. glReadPixels ist eigentlich in Ordnung, aber die Initialisierung von cv :: Mat entspricht Zeilen x Spalten, was Höhe x Breite bedeutet. Mit diesem Austausch sieht die Ausgabe jetzt gut aus.

void exportImage() 
{ 
    int width = 200; 
    int height = 100; 
    GLubyte *data = new GLubyte[4*width*height]; 
    glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE, data); 
    cv::Mat imageMat(height, width, CV_8UC4, data); 
    cv::flip(imageMat, imageMat, 0); 
    cv::imwrite("ok.jpg",imageMat); 
} 

enter image description here