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

Posted

技术标签:

【中文标题】有没有办法用 ARCore 相机设置自动对焦?【英文标题】:Is there any way to set auto focus with ARCore camera? 【发布时间】: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 最终应该会添加支持。 【参考方案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

以上是关于有没有办法用 ARCore 相机设置自动对焦?的主要内容,如果未能解决你的问题,请参考以下文章

相机自动对焦完成后directshow有回调吗?

是否能关闭android手机的自动对焦功能??

相机参数知识

如何判断相机是不是聚焦成功

手机照相时怎么自对焦

在相机android中设置矩形焦点