使用 OpenCV 处理来自 glReadPixels 的图像并将其作为纹理返回

Posted

技术标签:

【中文标题】使用 OpenCV 处理来自 glReadPixels 的图像并将其作为纹理返回【英文标题】:treating image from glReadPixels with OpenCV and return it as a texture 【发布时间】:2016-11-20 03:43:13 【问题描述】:

我正在尝试使用 C++ 在 android 上使用 OpenCV 和 GLES20 进行一些基本操作。

我使用 CameraGLSurfaceView 及其回调 onCameraTexture(...) 调用我传递到我的本地库。

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

但是当我尝试使用像素时,图像会损坏。

我的 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 之间转换格式。

如何正确转换格式?

【问题讨论】:

【参考方案1】:

垫子的尺寸是我的错误:

cv::Mat in(w,h,CV_8UC4) 应该是 cv::Mat in(h,w ,CV_8UC4)

【讨论】:

以上是关于使用 OpenCV 处理来自 glReadPixels 的图像并将其作为纹理返回的主要内容,如果未能解决你的问题,请参考以下文章

处理来自内存缓冲区的视频流

OpenCV 显示和处理网络摄像头流

50 行代码,看 Python + OpenCV 玩转实时图像处理!

使用 openCV(.release() 和 =Mat() 释放 Mat 图像不起作用)

OpenCV3图像处理笔记

使用 OpenCV 触摸和选择对象