【问题标题】:Is there any way to set auto focus with ARCore camera?有没有办法用 ARCore 相机设置自动对焦?
【发布时间】:2018-08-01 11:08:33
【问题描述】:

我正在开发一个需要使用 ARCore 放置对象的应用程序。然后我需要将帧保存为图像。

那么有没有办法为 ARCore 相机设置自动对焦?

【问题讨论】:

  • 我需要在 arcore 相机上使用相机自动对焦。但是arcore相机没有提供任何对焦功能。所以我想我们可以使用硬件相机来设置自动对焦。所以要获取相机实例,我们需要根据 api 版本使用 Camera.open() 或 CameraManager.Open()。如果我使用 camera1 或 camera 2 api 打开与相机的连接,ARCore 会丢失上下文。并且要设置焦点,预览必须在前景中,所以有人知道获取相机镜头实例的替代方法吗?
  • 与 ARKit 的初始版本一样,ARCore 似乎还不支持自动对焦:github.com/google-ar/arcore-unity-sdk/issues/49。不过今年春天推出的 ARKit 1.5 确实支持它,所以 ARCore 最终应该会添加支持。

标签: java android kotlin augmented-reality arcore


【解决方案1】:

从 ARCore 1.4 开始,您可以通过 ARCore Session 的配置启用或禁用自动对焦:

Session session = new Session(context);
Config config = new Config(session);
if (enableAutoFocus) {
  config.setFocusMode(Config.FocusMode.AUTO);
} else {
  config.setFocusMode(Config.FocusMode.FIXED);
}
session.configure(config);

https://developers.google.com/ar/reference/java/com/google/ar/core/Config.html#setFocusMode(com.google.ar.core.Config.FocusMode)

【讨论】:

  • 试过了,还是不行。能发个视频链接来展示一下这个功能吗?
  • 这段代码与google提供的示例ARCore应用程序大致相同。您是否尝试过构建和运行示例应用程序? github.com/google-ar/arcore-android-sdk/blob/…
  • 所有示例保存为ComputerVision。这段代码显然只是在这个例子中。我试试看。
【解决方案2】:

老问题,但我想我会用Sceneform 中的实现来更新答案。 Sceneform SDK 1.4 添加了设置自动对焦的功能。我使用扩展功能来启用它。

全局声明相关字段。

//The AR Core session
private var arSession: Session? = null
private var arConfig: Config? = null

以及扩展函数定义:

private fun Session.setupAutofocus() {

        //Create the config
        arConfig = Config(this)

        //Check if the configuration is set to fixed
        if (arConfig?.focusMode == Config.FocusMode.FIXED)
            arConfig?.focusMode = Config.FocusMode.AUTO

        //Sceneform requires that the ARCore session is configured to the UpdateMode LATEST_CAMERA_IMAGE. 
        //This is probably not required for just auto focus. I was updating the camera configuration as well
        arConfig?.updateMode = Config.UpdateMode.LATEST_CAMERA_IMAGE

        //Reconfigure the session
        configure(arConfig)

        //Setup the session with ARSceneView
        fragment.arSceneView.setupSession(this)

        //log out if the camera is in auto focus mode
        ARApplication.log("The camera is current in focus mode : ${config.focusMode.name}")
}

你的活动的onResume是一个很好的称呼它的地方@

override fun onResume() {
    super.onResume()

    //Check if ARSession is null. If it is, instantiate it
    if(arSession == null) {
        arSession = Session(this@EdgeActivity)
        arSession?.setupAutofocus()
    }
}

【讨论】:

    【解决方案3】:

    以下是 Google ARCore 工程师对Config.FocusMode 的评价:

    public static final enum Config.FocusMode
    

    Config.FocusMode 枚举选择相机焦点子系统的所需行为。目前,默认的焦点模式是FIXED,但这个默认值将来可能会改变。注意,在 ARCore 不支持自动对焦的设备上,由于使用了定焦摄像头,设置 AUTO 将被忽略。有关受影响设备的列表,请参阅 ARCore 支持的设备页面。

    为了获得最佳的 AR 跟踪性能,请使用默认会话配置提供的对焦模式。拍摄图片或视频时,请使用AUTO。为了获得最佳的 AR 跟踪,一旦不再需要自动对焦行为,请恢复为默认对焦模式。如果您的应用需要定焦摄像头,请在启用 AR 会话之前致电 setFocusMode(Config.FocusMode)(FIXED)。这将确保您的应用始终使用固定焦点,即使默认相机配置焦点模式在未来版本中发生更改。

    有两个值:

    public static final Config.FocusMode AUTO
    public static final Config.FocusMode FIXED
    

    所以,在 Java 代码中:

    Config ar_session_config = session.getConfig();
    ar_session_config.setFocusMode(Config.FocusMode.AUTO);
    session.configure(ar_session_config);
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      如果问题出在 Unity 项目中,请将 CameraFocusMode 参数更改为 Auto 而不是 Fixed

      【讨论】:

      • 你是怎么得到这个选项的?您使用的是哪个版本的 Unity?
      • Unity 版本:2018.3 ARCore unity 包参考here
      猜你喜欢
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多