有没有办法用 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 相机设置自动对焦?的主要内容,如果未能解决你的问题,请参考以下文章