2016-11-20 13 views
0

Ich versuche mit einigen grundlegenden Operationen mit OpenCV und GLES20 auf Android mit C++ zu beginnen.Bild von glReadPixels mit OpenCV behandeln und als Textur zurückgeben

Ich benutze CameraGLSurfaceView und seine Callback onCameraTexture (...), die ich in meine native Bibliothek aufrufen.

Anrufe fließen gut, ich kann Frame-Puffer zu Vektor lesen und an Textur übergeben, ohne zu ändern, und es funktioniert wie erwartet.

Aber wenn ich versuche, mit Pixeln zu arbeiten, bekomme ich Bild gebrochen.

broken immage

Meine C++ Code:

cv::Mat in(w,h,CV_8UC4); 
    cv::Mat out(w,h,CV_8UC4); 

    glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, in.data); 

    // following operations break image >> 
    cv::cvtColor(in, out, CV_RGBA2BGRA); 
    cv::flip(out, in, 0); 
    cv::cvtColor(in, out, CV_BGRA2RGBA); 
    // << prev operations break image 

    glBindTexture(GL_TEXTURE_2D, (GLuint) tex2); 

    glTexImage2D(GL_TEXTURE_2D, 
       0, 
       GL_RGBA, 
       w, 
       h, 
       0, 
       GL_RGBA, 
       GL_UNSIGNED_BYTE, 
       out.ptr()); 

    glBindTexture(GL_TEXTURE_2D, 0); 

    in.release(); 
    out.release(); 

Ohne Bild signiert Operationen geht an Textur und ist gut angezeigt.

Ich verstehe, dass mein Fehler in der Konvertierung von Formaten zwischen OpenGL und OpenCV ist.

Wie Formate richtig konvertieren?

Antwort

0

Es ist mein Fehler mit Größen von Mat:

cv :: Mat in (w, h, CV_8UC4) sollte cv werden :: Mat in (h, w, CV_8UC4)