【问题标题】:Getting the RAW camera data on android?在android上获取RAW相机数据?
【发布时间】:2016-03-14 21:14:09
【问题描述】:

我想处理每个传入帧的位数组,基本上是针对每个帧从相机传感器接收到的 YUV 格式并对其进行一些处理。 我是 java/android 新手,边走边学,所以我的一些问题非常基础,但我找不到任何适合我需要的答案。

Q1:如何获得相机传感器接收到的每一帧的位数组? (如何保存 YUV 字节流以供进一步使用?)
Q2:如何设置每接收到一个新的帧都会接收一个新的数据数组进行处理?
Q3:我是否必须设置预览才能做到这一点,或者我可以直接点击保存打开相机的原始数据的缓冲区吗?
Q4:预览会减慢(接收新帧)的过程吗?

如果需要一些进一步的解释:这个想法是创建一种与闪烁的 LED 灯和智能手机进行通信的方式,通过将手机摄像头指向 LED,实时过程将记录细微的变化并将它们解码到原始发送数据。为此,我计划接收每一帧的 YUV 数据,将其剥离到 Y 部分并决定每一帧的灯是开还是关。

【问题讨论】:

    标签: android camera


    【解决方案1】:

    是的,那是Camera API。 Android 21 及更新版本支持camera2 API,这可以让您更快地响应,但这取决于设备。如果您的目标是最大覆盖率,我仍建议您使用已弃用的旧 API。

    通常,Android 相机生成 NV21 格式,从中提取 8bpp 亮度非常容易。

    如果您想捕捉相机帧,Android 需要实时预览。有很多变通方法可以使最终用户隐藏预览,但不支持这种方法,任何此类技巧都可能在下一个设备或下一次系统升级时失败。但不用担心:实时预览完全不会延迟您的处理速度,因为它都是在单独的硬件通道中完成的。

    总而言之,当您使用 Camera.setPreviewCallbackWithBuffer() 并执行所有操作 correctly 时,您可以期望在平均设备上接收 30 fps。完全实现 camera2 api 的高端设备可能会提供更高的帧速率。三星发布了自己的相机sdk。如果您需要三星设备的某些特殊功能,请使用它。

    在多核设备上,您可以将图像处理卸载到线程池,但帧速率仍然可能会受到相机硬件的限制。

    请注意,您可以在GPU 中执行一些有限的图像处理,将着色器应用于从相机获取的纹理。

    【讨论】:

      【解决方案2】:

      假设您已完成基本操作,并且您已获得相机预览和相机对象。您可以致电:

      Camera.PreviewCallback callback = new Camera.PreviewCallback() {
          @Override
          public void onPreviewFrame(byte[] data, Camera camera) {
              //Do your processing here... Use the byte[] called "data"
          }
      };
      

      然后:

      mCamera.setPreviewCallback(callback);
      

      如果从不调用 Camera.Parameters.setPreviewFormat(),则默认格式为 NV21,使用 NV21 编码格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        • 2023-02-24
        • 1970-01-01
        相关资源
        最近更新 更多