获取每个android.hardware.camera2帧在surfacetexture上显示之前的数据
Posted
技术标签:
【中文标题】获取每个android.hardware.camera2帧在surfacetexture上显示之前的数据【英文标题】:get data of each android.hardware.camera2 frame before it is displayed on the surfacetexture 【发布时间】:2015-09-22 15:52:48 【问题描述】:在我的 android 应用程序中,我需要获取 android.hardware.camera2 返回的每一帧,对其数据进行一些处理,然后才将其显示在表面纹理上。 这个问题与我的类似,但对我没有帮助: Camera preview image data processing with Android L and Camera2 API
我试图从这里获取框架(如问题答案中所建议的那样):
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener()
@Override
public void onImageAvailable(ImageReader reader)
Log.d("Img", "onImageAvailable");
mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
;
这没有用,因为回调仅在用户执行图像捕获后调用。而且我不仅需要在捕获时使用它,还需要获取发送到 camerapreview 表面的每一帧。 我想知道,也许农场可以在这里(从纹理):
public void onSurfaceTextureUpdated(SurfaceTexture texture)
Log.d("Img", "onSurfaceTextureUpdated");
如果是,怎么做?
我正在使用来自谷歌的这个示例,作为基础:
https://github.com/googlesamples/android-Camera2Basic
【问题讨论】:
SurfaceTexture 将相机帧转换为 OpenGL ES 纹理,然后在预览 Surface 上渲染。您可以将其渲染到屏幕外 pbuffer 并使用glReadPixels()
读取像素。不确定这是否是在 Camera2 中执行此操作的最佳方式。
谢谢。我会尝试。但可能有一种方法可以直接从相机回调中获取。
【参考方案1】:
是的,您绝对可以从相机回调中获取缓冲区。您可以提供自己的纹理并在需要时对其进行更新,甚至可以修改此缓冲区的像素数据。
您应该将“原始”SurfaceTexture(在 createCaptureSession() 中指定)推离屏幕,否则它会干扰您过滤/修改的缓冲区。
这种方法的主要警告是,您现在有责任及时生成伪预览缓冲区。
【讨论】:
【参考方案2】:我也想做一些图像处理。我一直在研究 github.com/googlesamples/android-Camera2Basic 上的代码,我相信 mCaptureSession 会将相机的管道重定向到预览纹理和捕捉本身,但不能同时重定向到两者。预览纹理由 mCaptureSession.setRepeatingRequest 进行“刷新”,并且当在 captureStillPicture() 上触发“捕获”时调用 mOnImageAvailableListener,但是如果禁用“预览纹理”并且使用与“预览纹理”相同的构建器设置重复请求' 必须尝试调用 mOnImageAvailableListener 它只是不起作用。有其他人一直在努力吗?有什么启示吗?
【讨论】:
以上是关于获取每个android.hardware.camera2帧在surfacetexture上显示之前的数据的主要内容,如果未能解决你的问题,请参考以下文章
R语言dataframe获取每个字段(特征)的数据类型实战:使用sapply函数获取每个字段(特征)的数据类型通过柱状图可视化特征的种类以及个数