Android Camera2 获取RAW数据

这边文章主要记录下在Android系统上,如何通过Camera2 API去拿到RAW数据,也是当个备忘。

平时我们拿实时预览数据,更多的是获取yuv数据。一般涉及到raw域算法在APP层实现的时候,我们才会用到获取raw数据。

APP上集成Raw算法的思路。以拍照为例,基本是这样:APP拿到raw数据,处理完成后,再通过reprocess接口,再次传给hal,然后这个数据会经过平台端isp各个模块处理,最后编码生成的jpeg数据,再回调给上层。

当然,还会有其它使用场景,比如传输raw数据给三方算法,三方算法处理完成后,直接就返回bitmap或者其它数据类型,本地进行保存或者做其它处理等等。

关于reprocess接口的调用,以及应用端Raw域算法的集成,前面在csdn专栏和知识星球也有写过,感兴趣的同学可以去翻翻看看~

CSDN文章链接:https://blog.csdn.net/Mr_ZJC/article/details/129908488?spm=1001.2014.3001.5501

好了,回到我们这篇文章的重点。重点介绍Raw数据的获取。

相关实现代码,google已经给出了官方的demo(微信公众号底部,回复:raw,可获取完整demo代码。

本文介绍的内容也是基于官方demo来展开~

如果大家了解或者使用过Camera2获取实时yuv或者拍照jpeg数据,那获取raw,其实流程上都是一样。Camera2上我们需要拿到camera的数据,都是通过ImagerReader来获取。

下面贴下核心代码:

1)创建Raw相关的RawImageReader,以及设置数据available监听;


private RefCountedAutoCloseable<ImageReader> mRawImageReader;

 mRawImageReader = new RefCountedAutoCloseable<>(
                                ImageReader.newInstance(largestRaw.getWidth(),
                                        largestRaw.getHeight(), ImageFormat.RAW_SENSOR, /*maxImages*/ 5));
                                        
 mRawImageReader.get().setOnImageAvailableListener(
                            mOnRawImageAvailableListener, mBackgroundHandler);

2) 创建session的时候,把RawImagerReader的surface设置下去。表示我们需要请求该数据。

mCameraDevice.createCaptureSession(Arrays.asList(surface,
                            mJpegImageReader.get().getSurface(),
                            mRawImageReader.get().getSurface()), new CameraCaptureSession.StateCallback() {
                        @Override
                        public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                            synchronized (mCameraStateLock) {
                            ......
                        }

                        @Override
                        public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                           ......
                        }
                    }, mBackgroundHandler
            );

3)点击拍照后,在数据回调监听里面,对数据进行保存。

private final ImageReader.OnImageAvailableListener mOnRawImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {

        @Override
        public void onImageAvailable(ImageReader reader) {
            dequeueAndSaveImage(mRawResultQueue, mRawImageReader);
        }

    };

通过上面的代码片段,大家可以看到,其实流程真的是和我们拍照和获取yuv数据是一样的。

这里有个疑问点,相信有不少同学也有 同样的疑惑。初始化ImageReader的时候,RAW相关的格式,光是从名字上看,就有4个,应该选择用哪个呢,它们之间又有什么区别呢。

如下图所示,RAW10和RAW12,是和bit位数相关。Google官方demo,选择的格式是RAW_SENSOR。

推荐阅读:

关于我

独家 | Android Camera 面试流程、经验分享

一篇文章带你了解Android 最新Camera框架

深圳上班,

从事Android Camera相关软件开发工作,

公众号记录生活和工作的点滴,

欢迎加入“小驰成长圈”,期待和你相遇~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android Camera2 Demo是一个展示了如何使用Android相机API的示例应用程序。该示例应用程序基于Android 5.0(API 21)及更高版本的Android平台。它展示了如何使用Camera2 API来实现高级功能,如手动对焦、手动曝光、RAW图像捕获等。 首先,在应用程序的布局文件中,我们需要添加一个TextureView来显示相机预览画面。然后,在MainActivity中,我们需要创建一个CameraManager的实例,以获取设备上的相机列表。接下来,我们需要实现一个CameraDevice.StateCallback来处理相机设备的打开和关闭。 当我们选择一个相机设备时,我们可以通过CameraManager的openCamera方法打开相机。然后,我们可以创建一个CaptureRequest.Builder来构建捕获请求,设置相机参数和预览目标。我们还需要创建一个CameraCaptureSession来发送捕获请求。 我们可以通过设置CaptureRequest.Builder的参数来实现手动对焦和手动曝光。例如,我们可以使用CONTROL_AF_MODE来设置对焦模式,使用CONTROL_AE_MODE和CONTROL_AE_EXPOSURE_COMPENSATION来设置曝光模式和曝光补偿。 在捕获图像时,我们可以使用ImageReader类来创建一个ImageReader实例,用于获取捕获的图像数据。我们可以在CameraCaptureSession.CaptureCallback的onCaptureCompleted回调方法中处理捕获的图像数据,并将其保存到本地文件中。 此外,我们还可以使用CameraCharacteristics类来获取相机设备的特性,如支持的对焦模式、支持的曝光模式等。我们还可以使用CameraMetadata类来设置相机参数,如对焦区域、曝光补偿等。 总之,Android Camera2 Demo演示了如何使用Camera2 API来创建一个全功能相机应用程序。它展示了如何打开相机、设置相机参数、捕获图像并处理图像数据。通过学习和理解这个示例应用程序,我们可以更好地了解和使用Android相机API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小驰成长圈

谢谢老板,今晚吃鸡~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值