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

时间:2017-10-16 10:46:47

标签: ios arkit

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

除了没有标记检测外,

ARKit很棒。

到目前为止,我已经尝试使用视觉来检测标记并且没有成功。 我可以在标记检测中使用一些样本并在iOS标记上显示三维模型吗?

先谢谢。

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现您的目标,尽管可以说最简单的是使用图像是标记。

ARKit 1.5开始,您可以使用ReferenceImages放置与您在VuforiaEasyAR中使用的标记基本相同的AR内容。< / p>

对于您的信息,referenceImage只是:

  

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

要使用此功能,您需要传入:

  

将参考图像收集到您的会话配置中   detectionImages属性。

可以这样设置:

var detectionImages: Set<ARReferenceImage>! { get set }

ARKit 1.5需要注意的一点是,Vuforiaextended tracking不同,可以允许SampleCode张图片:

  

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

正如@Alexander所说,了解这可能适合您的情况的最佳选择是在线查看DocumentationARReferenceImage,可在此处找到:

Recognizing Images In An AR Experience

然而,核心要点是:

启用图像检测:

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

init(CGImage, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat) 也可以使用以下方法动态创建:

init(CVPixelBuffer, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
  

从Core Graphics图像创建新的参考图像   对象

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之前传入ARReferenceImages,例如:

ARReferenceImage

处理图像检测:

ARSession检测到ARImageAnchor并创建了ARSCNViewDelegate时,会提供:

  

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

如果图像检测成功,则需要使用以下func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { } 回调来处理对象的放置等:

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)
    }

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

const NAMEURL = "https://uzby.com/api.php"

// get data from api
function getDataFromApi(value, callback){
  const QUERY = {
    min:`${value}`,
    max:`${value}`
  }
  $.getJSON(NAMEURL, QUERY, callback)
}

function renderResult(result){
  return `${result}`;
}

// render results to page
function displayName(data){
  console.log(data);
  const results = renderResult(data);
  $('.nameResult').html(results);
}

// wait for user to submit
function watchSubmit() {
  $('.js-search-form').submit(event => {
    event.preventDefault();
    const queryTarget = $(event.currentTarget).find('#js-dropValue');
    const thisquery = queryTarget.val();
    getDataFromApi(thisquery, displayName);
  });
}
// running the watch submit function waiting for click
$(watchSubmit);

希望它有所帮助...