2016-11-20 167 views
0

我想从使用C++的Android上的OpenCV和GLES20进行一些基本操作开始。使用OpenCV处理来自glReadPixels的图像并将其作为纹理返回

我使用CameraGLSurfaceView及其调用onCameraTexture(...)调用我传入我的本机库。

调用流畅,我可以读取帧缓冲区矢量,并将其传递到纹理而不会改变,并按预期工作。

但是,当我尝试使用像素,我得到的图像损坏。

broken immage

我的C++代码:

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(); 

没有签署操作画面去质地和显示良好。

我知道我的错误是在OpenGL和OpenCV之间转换格式。

如何正确转换格式?

回答

0

这是我的错误与垫的尺寸:

CV ::席子(W¯¯^h,CV_8UC4)应CV ::席子(^hW¯¯,CV_8UC4)