ARKit是否能像Vuforia一样跟踪物体?

16

我找不到任何关于苹果ARKit是否支持类似Vuforia的3D物体跟踪(甚至图像跟踪)的信息。 我不希望将3D模型放在世界上的任何地方,而是想要检测特定的3D对象并在该对象前面和顶部放置AR对象。

简单例子:我想在现实世界中跟踪一个特定的玩具车,并在AR场景中在其顶部添加一个尾翼。

有人能否提供我是否可能的信息?


到目前为止,你可以使用ARKit来实现这一点。你应该使用一些实时图像处理技术,比如TensorFlow或Watson来检测物体。 - Matloob Hasnain
@matloob Hasnain 目前 Vuforia 运行良好,但客户想知道我们是否可以使用 ARKit。 - Superwayne
是的,我知道关于Vuforia标记扫描的事情。 - Matloob Hasnain
那么在ARKit中没有类似的开箱即用功能吗? - Superwayne
我不这么认为。它只是给我们提供了真实世界物体的位置和锚点,以及放置物体。 - Matloob Hasnain
3个回答

30

iOS 12 更新:在“ARKit 2”(又称 iOS 12 或更高版本上的 ARKit)中...

  • 图像检测扩展到了图像跟踪,因此最多四个图像不仅会被检测一次,它们会每帧更新“实时”即使它们相对于世界空间移动。因此,您可以将可识别的 2D 图像附加到玩具上,并在屏幕上跟随玩具的虚拟 AR 内容。

  • 还有物体检测 - 在开发过程中,您可以使用一个 ARKit 应用程序扫描现实世界的 3D 物体并生成“参考对象”文件。然后,您可以在应用程序中发送该文件,并将其用于识别用户环境中的该对象。这可能适用于您的“玩具车”案例...但请注意,3D 物体识别功能是检测而不是跟踪:ARKit 不会随着玩具车的移动而跟随它。

详细信息请参见WWDC18 关于 ARKit 2 的讲座


iOS 11.3更新:在“ARKit 1.5”(又称iOS 11.3或更高版本的ARKit)中,有一个名为“图像检测”的新功能。如果你有一个已知的图片(如海报、纸牌等),可以将它包含在你的Xcode项目中和/或从其他地方加载它作为ARReferenceImage并将其放置在你的会话配置的detectionImages数组中。然后,当ARKit在用户环境中发现这些图片时,它会提供ARImageAnchor对象告诉你它们的位置。

请注意,这与其他一些工具包中看到的“基于标记的AR”并不完全相同-ARKit仅在找到参考图像时才会告诉您它的移动方式。因此,它适用于“触发”AR内容体验(例如您在商店将手机对准《星球大战》海报时,角色走出来的那些促销活动),但不适用于虚拟角色留在游戏棋子上的AR棋盘游戏等情况。
否则...
每个捕获的ARFrame中都可以访问相机图像,因此如果您有其他可以帮助完成此类任务的软件,则可以与ARKit一起使用它们。例如,Vision框架(在iOS 11中也是新的)提供了几个用于此类任务的构建块 - 您可以检测条形码并找到它们的四个角落,并在手动识别图像中感兴趣的区域后,在帧之间跟踪其运动。

这是否意味着您可以找到一个物体,等待一段时间,再次找到该物体,然后获取距离,从而计算出物体的速度和/或方向?我很想看到一个应用程序,它可以告诉您物体移动的速度。有时候,住在路边,我看到汽车开得太快了... - Netsi1964

3

iOS 12ARKit 2.0不仅支持相机跟踪功能,还包括:

  • 3D物体跟踪
  • 面部跟踪
  • 图像跟踪
  • 图像检测
  • 3D物体扫描

iOS 13ARKit 3.0支持更加高级的功能:

  • 人物遮挡(RGBAZ实时合成)
  • 身体跟踪(也称为动作捕捉)
  • 多人面部跟踪(最多3个面部)
  • 前后摄像头同时跟踪
  • 协作会话

你好ARGeo,我是Arkit的新手。我想使用ARKit从相机/图库图像中检测对象(桌子、瓶子、特殊形状或任何东西)。我看到一些示例提供了项目中预定义的图像,然后可以检测图像是否存在。但我不想这样做,我希望它能够学习,以便它可以检测任何桌子/瓶子?我需要使用Core ML和AirKit吗?有Swift的任何库/帮助吗?谢谢。 - Jamshed Alam
@JamshedAlam,请将其发布为一个问题。评论不适合此处。 - Andy Jazz
1
我在研究一些问题和博客后得到了答案。如果我有任何进一步的困惑,我会发布的。无论如何,谢谢。 - Jamshed Alam

3
注意:这绝对是一个黑客行为,但它将持久化图像跟踪添加到ARKit Unity中。同样的想法也可以应用于Native lib。
下载ARKit 1.5 beta https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/branch/spring2018_update 在ARSessionNative.mm中,添加以下代码块:
extern "C" void SessionRemoveAllAnchors(void* nativeSession) {
    UnityARSession* session = (__bridge UnityARSession*)nativeSession;
    for (ARAnchor* a in session->_session.currentFrame.anchors)
    {
        [session->_session removeAnchor:a];
        return;
    }
}

在UnityARSessionNativeInterface.cs文件中,在SessionRemoveUserAnchor下添加以下代码:
private static extern void SessionRemoveAllAnchors (IntPtr nativeSession);

并且在RemoveUserAnchor下面:

public void RemoveAllAnchors() {
        #if !UNITY_EDITOR

        SessionRemoveAllAnchors(m_NativeARSession);
        #endif
    }

然后从Update或Coroutine中调用此函数:

UnityARSessionNativeInterface.GetARSessionNativeInterface().RemoveAllAnchors ();

当锚点被移除后,图像可以再次被识别。虽然不是非常流畅,但它确实起作用。

希望这对你有所帮助!如果您需要进一步的帮助,请告诉我。


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