ARCore - 检测墙壁

时间:2017-10-10 20:23:59

标签: android augmented-reality object-detection arcore

我在看Android的新ARCore库。它有一种检测水平表面但没有检测垂直表面或墙壁的方法。

我实际上是想让示例应用程序检测到墙壁,但我遇到了很多问题。

在ARCore中有原生或非原生检测垂直曲面的方法吗?

3 个答案:

答案 0 :(得分:5)

<强>更新

现在最新版本的ARCore also has

public static final Config.PlaneFindingMode HORIZONTAL
// Detection of only horizontal planes is enabled.

public static final Config.PlaneFindingMode HORIZONTAL_AND_VERTICAL
// Detection of both horizontal and vertical planes is enabled.

OLD ANSWER

目前有no native way

public static final Config.PlaneFindingMode DISABLED
// Plane detection is disabled.

public static final Config.PlaneFindingMode HORIZONTAL
// Detection of only horizontal planes is enabled.

草绘here非本地方式: 访问点云数据并自行计算水平平面。但为了使它真正起作用,你必须实现聚类(分开多个平面而不是计算一个全局平面)和适当的异常值拒绝(可能使用RANSAC)。

就我个人而言,我认为(希望)下一次ARCore更新将包括垂直平面,因为我无法看到不支持此数据的数学原因。

答案 1 :(得分:1)

获取hellosceneform样本并将其转换为检测垂直和水平平面:

https://github.com/google-ar/sceneform-android-sdk/tree/master/samples/hellosceneform

创建一个新的Fragment子类化ArFragment并重写getSessionConfiguration方法:

public class CustomArFrag extends ArFragment {
@Override
protected Config getSessionConfiguration(Session session) {
    Config config = super.getSessionConfiguration(session);
    config.setPlaneFindingMode(Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL);
    return config;
}
}

更改activity_ux.xml布局以指向它:

  <fragment 
    android:name="com.google.ar.sceneform.samples.hellosceneform.CustomArFrag"
  .../>

请注意,并非总是可以检测到垂直表面。它似乎不喜欢大的白墙。它设法检测到冰箱的前部,而我却像磁铁一样将Android粘在冰箱上!

答案 2 :(得分:0)

ARCore 1.2为AR开发人员带来了三个新功能:Vertical Plane DetectionCloud AnchorsAugmented Images

列表中的第一个功能为Config.PlaneFindingMode添加了两个附加的Enum值:

public static final Config.PlaneFindingMode HORIZONTAL_AND_VERTICAL

public static final Config.PlaneFindingMode VERTICAL

让我们看看在真实的 Java 代码中的外观:

mArSession = new Session(this);

mArConfig = new Config(mArSession);
mArConfig.setPlaneFindingMode(Config.PlaneFindingMode.VERTICAL);       
mArConfig.setUpdateMode(Config.UpdateMode.LATEST_CAMERA_IMAGE);  
mArFragment.getArSceneView().setupSession(mArSession);

或者让我们看看真实的 Kotlin 代码中的样子:

mArSession = Session(this)

mArConfig = Config(this)
mArConfig?.planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL
mArConfig?.updateMode = Config.UpdateMode.LATEST_CAMERA_IMAGE
configure(mArConfig)
mArFragment.arSceneView.setupSession(this)

希望这会有所帮助。