使用 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 的图像并将其作为纹理返回的主要内容,如果未能解决你的问题,请参考以下文章
50 行代码,看 Python + OpenCV 玩转实时图像处理!