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.
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?