android - CPU 处理相机图像

标签 android opengl-es android-camera

目前我正在屏幕上显示相机预览,提供相机预览纹理 - camera.setPreviewTexture(...)(当然是使用 opengl 进行)。

我有一个本地库,它获取 bytes[] 作为图像,并返回 byte[] - 与输入图像相关的结果图像。我想调用它,然后将输入图像和结果绘制到屏幕上 - 彼此叠加。

我知道在 Opengl 中,为了将纹理数据返回到 CPU 中,我们必须使用 glReadPixel 读取它,并且在处理之后我必须将结果加载到纹理中 - 这每帧都将对性能产生重大影响。

我考虑过使用 camera.setPreviewCallback(...),我正在获取框架(调用处理方法并将结果传输到我的 SurfaceView),然后并行继续使用用于在屏幕上绘制的纹理预览技术,但我担心在 previewCallback 中获得的帧与我在纹理中获得的帧之间同步。

我错过了什么吗?或者没有简单的方法来解决这个问题?

最佳答案

一种可能有用的方法是将相机的输出定向到 ImageReader。 ,它提供了一个表面。发送到 Surface 的每一帧都作为 YUV 数据提供,无需副本,这使得它比某些替代方案更快。颜色格式(步幅、对齐、交错)的变化由 ImageReader 处理。

由于您希望相机图像与处理输出同时呈现,因此您不能沿着两条独立的路径发送帧。

框架准备就绪后,您需要进行颜色空间转换并使用 glTexImage2D() 上传像素。这可能是性能限制因素。

从评论来看,您似乎很熟悉使用 fragment 着色器进行图像过滤;对于发现此问题的任何其他人,您可以查看示例 here .

关于android - CPU 处理相机图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343000/

相关文章:

android - SDL 下 Android OpenGL ES 渲染中不确定的不需要的额外三角形

opengl-es - OpenGL ES 2.0 中的纹理点?

iphone - OpenGL ES 运行多个着色器

android - TextureView 的 "Consumer Side"何时关闭?

android - Camera.Preview Callback 是否因每一帧都调用 GC Malloc 而效率低下?

android - 将 ImageView 对齐,使 TextView 居中,复选框在 android xml 中最右边

java - 滑动旋转图像

java - 我应该使用哪个 Android/Java 集合来排序键值对,并返回给定点之后的元素

android - 从相机和图库上传在所有版本中均无法正常工作

android - 如何检查另一个 Activity 中是否按下了按钮?