首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ios中相应标记的标记检测和3d模型显示(使用ARkit)

ios中相应标记的标记检测和3d模型显示(使用ARkit)
EN

Stack Overflow用户
提问于 2017-10-16 18:46:47
回答 1查看 510关注 0票数 2

之前,我使用vuforia(unity)为iOS开发了一个AR应用程序。现在,我必须使用ARKit实现相同的应用程序。

除了没有标记检测之外,ARKit非常棒。

我已经尝试使用视觉来检测标记,但到目前为止还没有成功。我可以有一些样本用于标记检测和在iOS的标记上显示3d模型吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 07:19:16

有许多方法可以实现你正在寻找的东西,尽管可以说最简单的方法是使用图像作为标记。

ARKit 1.5开始,您可以使用ReferenceImages放置AR内容,这些内容本质上与您在VuforiaEasyAR中使用的标记相同。

对于您的信息,referenceImage是简单的:

要在世界跟踪AR会话期间在真实环境中识别的图像。

要使用此函数,您需要传入一个:

会话配置的detectionImages属性的引用图像的

集合。

它可以像这样设置:

代码语言:javascript
复制
var detectionImages: Set<ARReferenceImage>! { get set }

使用ARKit 1.5需要注意的重要一点是,与Vuforia不同的是,它允许对图像执行extended tracking操作:

图像检测不会连续跟踪图像的真实运动,也不会跟踪图像从视图中消失的时间。图像检测最适用于AR内容响应场景中的静态图像的情况-例如,识别博物馆中的艺术或向电影海报添加动画元素。

正如@Alexander所说,要了解这如何适合您的情况,最好的办法是查看SampleCodeDocumentation online,可在此处获得:

Recognizing Images In An AR Experience

然而,核心要点是:

启用图像检测的

您需要首先提供一个或多个ARReferenceImage资源。可以使用Xcode中的AR资源目录手动添加这些大小,请记住,您必须在Xcode中尽可能准确地输入图像的物理大小,因为ARKit依赖此信息来确定图像与相机的距离。

还可以使用以下方法动态创建ARReferenceImages

代码语言:javascript
复制
init(CGImage, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)

,它从核心图形图像对象创建新的参考图像。

代码语言:javascript
复制
init(CVPixelBuffer, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)

,它从核心视频像素缓冲区创建新的参考图像。

完成此操作后,您需要创建一个world tracking配置,在运行ARSession之前传入ARReferenceImages。例如:

代码语言:javascript
复制
guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil) else { return }

let configuration = ARWorldTrackingConfiguration()
configuration.detectionImages = referenceImages
session.run(configuration, options: [.resetTracking, .removeExistingAnchors])

图像的处理检测:

当您的ARSession检测到ARReferenceImage并创建ARImageAnchor时,它只是提供:

有关在世界跟踪AR会话中检测到的图像的位置和方向的信息。

因此,如果图像检测成功,您将需要使用以下ARSCNViewDelegate回调来处理对象的放置等:

代码语言:javascript
复制
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { }

使用它处理3D内容放置的示例如下所示:

代码语言:javascript
复制
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        //1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
        guard let currentImageAnchor = anchor as? ARImageAnchor else { return }

        //2. Get The Targets Name
        let name = currentImageAnchor.referenceImage.name!

        //3. Get The Targets Width & Height
        let width = currentImageAnchor.referenceImage.physicalSize.width
        let height = currentImageAnchor.referenceImage.physicalSize.height

        //4. Log The Reference Images Information
        print("""
            Image Name = \(name)
            Image Width = \(width)
            Image Height = \(height)
            """)

        //5. Create A Plane Geometry To Cover The ARImageAnchor
        let planeNode = SCNNode()
        let planeGeometry = SCNPlane(width: width, height: height)
        planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
        planeNode.opacity = 0.25
        planeNode.geometry = planeGeometry

        //6. Rotate The PlaneNode To Horizontal
        planeNode.eulerAngles.x = -.pi/2

        //7. The Node Is Centered In The Anchor (0,0,0)
        node.addChildNode(planeNode)

        //8. Create AN SCNBox
        let boxNode = SCNNode()
        let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)

        //9. Create A Different Colour For Each Face
        let faceColours = [UIColor.red, UIColor.green, UIColor.blue, UIColor.cyan, UIColor.yellow, UIColor.gray]
        var faceMaterials = [SCNMaterial]()

        //10. Apply It To Each Face
        for face in 0 ..< 5{
            let material = SCNMaterial()
            material.diffuse.contents = faceColours[face]
            faceMaterials.append(material)
        }
        boxGeometry.materials = faceMaterials
        boxNode.geometry = boxGeometry

        //11. Set The Boxes Position To Be Placed On The Plane (node.x + box.height)
        boxNode.position = SCNVector3(0 , 0.05, 0)

        //12. Add The Box To The Node
        node.addChildNode(boxNode)
    }

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46768493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档