使用OpenGL在Android中进行图像处理。glReadPixel很慢,不明白如何EGL_KHR_image_base包含在我的项目中工作



所以我正在尝试获取相机像素数据,监测亮度的任何重大变化,然后保存图像。我决定使用open gl,因为我认为在碎片着色器中进行光度检查会更快。

我将表面纹理绑定到相机以将图像获取到着色器,并且目前正在使用glReadPixels获取像素,然后将其放入位图中并保存。glReadPixels上的瓶颈太疯狂了,所以我研究了其他选项,发现EGL_KHR_image_base可能是我使用OpenGL ES 2.0的最佳选择。

不幸的是,我没有扩展的经验,也不知道在哪里可以找到我需要的东西。我已经下载了ndk,但很困惑。如果我不完全理解,有人能给我指一些文档的方向并帮助解释吗?

使用glReadPixels()复制像素可能很慢,但可能会因特定设备和像素格式的不同而有很大差异。使用glReadPixels()保存视频数据中的帧(最初也是YUV)的一些测试发现,96.5%的时间是在Nexus 5上进行PNG压缩和文件I/O。

在某些情况下,如果源格式和目标格式不匹配,所需的时间会大大增加。在一个特定的设备上,我发现复制到RGBA而不是RGB可以减少所需的时间。

EGL调用可以工作,但需要非公共的API调用。这有点棘手;参见例如这个答案。(我认为编辑中的注释会让它发挥作用,但我从未回头尝试过,现在我也无法这样做。)

唯一的解决方案是使用Pixel Pack Buffer(PBO),其中读取是异步的。然而,要使用这种异步,您需要有PBO并将其用作乒乓缓冲区。

我指的是http://www.jianshu.com/p/3bc4db687546其中我将1080p的读取时间从40ms减少到20ms。

最新更新