我正在开发一款需要使用ARCore放置物体的应用程序。然后我需要将帧保存为图像。
那么有没有办法为ARCore相机设置自动对焦?
我正在开发一款需要使用ARCore放置物体的应用程序。然后我需要将帧保存为图像。
那么有没有办法为ARCore相机设置自动对焦?
从ARCore 1.4开始,您可以通过ARCore会话的配置启用或禁用自动对焦:
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);
ComputerVision
之外的所有示例。这段代码显然只在这个示例中。我会尝试它。 - Clinkz以下是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
Config ar_session_config = session.getConfig();
ar_session_config.setFocusMode(Config.FocusMode.AUTO);
session.configure(ar_session_config);
虽然这是一个老问题,但我想用 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()
}
}