【问题标题】:CPU processing on camera image相机图像的 CPU 处理
【发布时间】:2016-05-22 10:41:48
【问题描述】:

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

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

我知道在 Opengl 中,为了在 CPU 中获取纹理数据,我们必须使用 glReadPixel 读取它,并且在处理之后我必须将结果加载到纹理中 - 这将对每一帧都有表演。

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

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

【问题讨论】:

  • 你说得对,SurfaceTexture和onPreviewFrame之间没有同步。就在几分钟前,我发布了一个类似的answer。请检查它对您的相关程度。
  • 不是我想读的答案,但很遗憾,这就是我的想法
  • 不要惩罚信使 ;) 将相机帧推送到自定义纹理在 Android 上非常有效;我们在 720p 时达到了 30 FPS。
  • 我没有把你带到这里。 将相机帧推送到自定义纹理 ?我需要将帧的数据作为字节数组 - 这是我的问题。我正在使用 frag-shader 进行一些操作,但主要算法是在本机中获取此数据数组
  • As fadden explains 更详细,需要传递像素来显示;当今 Android 上最有效的机制之一是 glTexImage2D()(或 glTexSubImage2D()

标签: android opengl-es android-camera


【解决方案1】:

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

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

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

从 cmets 看来,您对使用片段着色器进行图像过滤很熟悉;对于发现此内容的其他人,您可以查看示例 here

【讨论】:

  • 你指的是使用camera2 api.. 但不幸的是我的 min sdk 是 18.. 所以我想我必须使用 camera.setpreviewcallbackwithbuffer(...)
  • 其实原始相机 API 可以将输出发送到 Surface,但是直到 API 19 才引入 ImageReader。
  • 是否可以将 ImagerReader 的表面连接到相机(camera1 api)?
  • 是的。 ImageReader 类实际上是由 Camera 团队添加的。 Camera2 直到 API 21 才可用。
  • 我们如何将它附加到相机预览中?它正在获取“SurfaceTexture”或“SurfaceHolder”。图像阅读器提供简单的表面。可以参考例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多