有没有办法在ARCore相机中设置自动对焦?

9

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

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


我需要在ARCore相机中使用自动对焦,但ARCore相机没有为对焦提供任何内容。因此,我认为我们可以使用硬件相机来设置自动对焦。所以,为了获取相机实例,我们需要使用Camera.open()或CameraManager.Open()(取决于API版本)。如果我使用camera1或camera 2 API打开与相机的连接,ARCore就会失去上下文。而且,为了设置对焦,预览必须在前台,那么有人知道获取相机镜头实例的替代方法吗? - deeppandya
1
就像最初的ARKit版本一样,ARCore目前似乎还不支持自动对焦:https://github.com/google-ar/arcore-unity-sdk/issues/49。然而,即将在今年春季发布的ARKit 1.5版本已经支持它,因此ARCore应该最终会添加支持。 - ACVM
4个回答

13

尝试过了,不起作用。你能否发布一个视频链接展示一下功能? - Clinkz
这段代码与谷歌提供的示例ARCore应用程序大致相同。您尝试过构建和运行示例应用程序吗?https://github.com/google-ar/arcore-android-sdk/blob/a87eded256510dff6067283e522c368a3c2694ad/samples/computervision_java/app/src/main/java/com/google/ar/core/examples/java/computervision/ComputerVisionActivity.java#L379 - MrAlbean
除了ComputerVision之外的所有示例。这段代码显然只在这个示例中。我会尝试它。 - Clinkz

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);

希望这可以帮助到你。

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()
    }
}

1
如果问题出现在Unity项目中,那么将CameraFocusMode参数从Fixed改为Auto

Unity ARCoreConfig file settings


你是怎么得到这个选项的?你使用的Unity版本是什么? - Nick
Unity版本:2018.3 关于ARCore Unity包,请参考此处 - GuruJeya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接