ArCore 中的深度传感器

Depth Sensors In ArCore

我正在尝试了解 Arcore 中的深度 API。 我使用的是 Google Pixel4,我知道它有一个深度传感器: https://developers.google.com/ar/discover/supported-devices#google_play https://www.gsmarena.com/google_outlines_how_the_pixel_4s_dual_cameras_capture_depth_in_portrait_photos-news-40597.php

所以,如果我先调用 config.setDepthMode(Config.DepthMode.AUTOMATIC);

然后 frame.acquireDepthImage() 可以 return 图像。

但是,下面的代码没有找到兼容的传感器。如果我删除“REQUIRE_AND_USE”过滤器:我得到 9 个相机,所有相机的深度都为 DO_NOT_USE。

 private void UseADedicatedDepthSensor_NotWorkingOnPixel4() {
    CameraConfigFilter cameraConfigFilter=new CameraConfigFilter(session);
    cameraConfigFilter.setDepthSensorUsage(EnumSet.of( CameraConfig.DepthSensorUsage.REQUIRE_AND_USE));
    List<CameraConfig> cameraConfigList = session.getSupportedCameraConfigs(cameraConfigFilter);
    for (CameraConfig cameraConfig : cameraConfigList) {
      String cameraString="camera:"+cameraConfig.getCameraId()+" d:"+cameraConfig.getDepthSensorUsage().toString()+ " s:"+cameraConfig.getTextureSize().toString();
      System.out.println();
    }
    //this will crash as no camera has REQUIRE_AND_USE
    CameraConfig supportedCamera=cameraConfigList.get(0);
    System.out.println(supportedCamera.toString());
    session.setCameraConfig(cameraConfigList.get(0));
  }

所以我的问题是:

  1. Pixel4 是否有支持 arcore 的深度传感器?
  2. 如果是,那为什么我的相机的所有深度传感器都配置为:DO_NOT_USE
  3. 为什么我还能得到深度图?

答案结尾的总结。

在 ARCore API 中使用深度传感器进行 AR 跟踪和能够获取深度图像是有区别的,这两个功能的可用性是完全独立的:

  • Config.DepthMode 确定深度图像在您的 AR-enabled 应用中的可用性(例如遮挡、space 映射等)。但是 ARCore 不保证 acquireDepthImage 返回的图像来自何处。特别是,此图像可能不是来自硬件深度传感器。在许多情况下,它是在软件中构建的,结合了通过图像相机的 seen/tracked 和设备的 IMU 传感器报告的设备移动。即使在 ARCore 使用深度传感器的情况下,返回的深度图像也可以使用来自图像相机和传感器的附加数据进行进一步处理,而不是直接来自深度传感器的数据的原始副本。

  • CameraConfig.DepthSensorUsage 确定 ARCore 是否将使用硬件深度传感器来补充图像相机和 IMU 传感器,以便在 3D 中跟踪设备的移动 space。这与图像是否可以通过 acquireDepthImage 或图像的来源无关。通过 acquireDepthImage 获得深度图像并不表示 ARCore 必须使用深度传感器进行跟踪(或根本不使用)。

    之所以存在CameraConfig.DepthSensorUsage.REQUIRE_AND_USE,并不是为了通过acquireDepthImage保证深度图的可用性,而是要求ARCore以增加CPU/GPU 负载和功率使用。在某些情况下,应用程序可能想要放弃额外的跟踪精度,以延长电池寿命或为其他任务保留更多处理能力。

此外,这两个功能在给定设备型号上的可用性取决于不同的因素:

  • 通过 acquireDepthImage 的深度图像的可用性取决于设备的整体处理能力,因为从相机和 IMU 传感器数据生成深度图像需要大量的比仅在 3D 中跟踪设备的移动还要额外的处理开销 space。即使设备没有深度传感器或 ARCore 根本不支持使用深度传感器,也可以支持 acquireDepthImage

  • CameraConfig.DepthSensorUsage.REQUIRE_AND_USE 的可用性取决于 a) 设备是否具有深度传感器,b) 深度传感器是否具有足够的分辨率、帧速率和精度以供使用用于运动跟踪,并且 c) 设备具有足够的处理能力来处理将深度传感器数据纳入运动跟踪计算的额外处理开销。

查看 supported devices 的列表时,列出“支持深度 API”的设备应在调用 acquireDepthImage 时提供深度图像,而列出“支持 time-of-flight (ToF) hardware depth sensor”应该支持使用CameraConfig.DepthSensorUsage.REQUIRE_AND_USE(虽然值得注意的是只有很少的设备列出这个所以我怀疑有更多的设备支持它但没有列出)。同样,“支持深度 API”功能不能保证 ARCore 将使用硬件深度传感器(即使设备具有深度传感器)。理论上也有可能设备可能支持 CameraConfig.DepthSensorUsage.REQUIRE_AND_USE 但不通过 acquireDepthImage.

提供深度图像

根据支持的设备列表,Pixel 4 支持深度 API(acquireDepthImage),但 列出硬件深度传感器支持。


TL;DR acquireDepthImageCameraConfig.DepthSensorUsage.REQUIRE_AND_USE 是不同的 API,意思不同。 acquireDepthImage 为您提供深度图像,但不一定是由硬件深度传感器生成的图像。 CameraConfig.DepthSensorUsage.REQUIRE_AND_USE 表示硬件深度传感器将用于跟踪 3D 设备的移动 space。这些功能之一的可用性并不意味着其他功能也可用。特别地,acquireDepthImage 的可用性并不意味着 ARCore 正在使用或支持深度传感器。


  1. Pixel4 有支持 arcore 的深度传感器吗?

    否,根据支持的设备列表中的详细信息。 “Supports Depth API”表示可以通过acquireDepthImage获取深度图像,并不是ARCore支持硬件深度传感器。

  2. 如果是,那为什么我的相机的深度传感器都配置为:DO_NOT_USE

    因为 ARCore 不支持您设备的深度传感器。

  3. 怎么还能拍到深度图?

    深度图像是由软件根据 ARCore 可用的其他数据生成的,或者 ARCore 使用深度传感器生成深度图像但没有支持使用深度传感器进行运动跟踪(这是您通过设置 CameraConfig.DepthSensorUsage.REQUIRE_AND_USE 所要求的)。