IOS 关于ARKi利用

打印 上一主题 下一主题

主题 1000|帖子 1000|积分 3000

ARSCNView利用
  1. var sceneView: ARSCNView = ARSCNView(frame: UIScreen.main.bounds)
  2. let configuartion = ARWorldTrackingConfiguration()
  3.     //会话session ARSessionDelegate 会话状态更新相关代理方法
  4.         sceneView.session.delegate = self
  5.         //ARSCNViewDelegate 节点场景管理相关代理方法
  6.         sceneView.delegate = self
  7.         
  8.         // 自动对焦开启
  9.         configuartion.isAutoFocusEnabled = true
  10.         //平面检测方向
  11.         configuartion.planeDetection = .horizontal
  12.         //光线估计
  13.         configuartion.isLightEstimationEnabled = true
  14.         /*
  15.          使用提供的配置运行会话,
  16.          resetTracking 移动到新环境重新扫描追踪
  17.          */
  18.         sceneView.session.run(configuartion, options: [.resetTracking,.removeExistingAnchors])
  19.          //调试参数
  20.         sceneView.debugOptions = [SCNDebugOptions.showFeaturePoints]
复制代码
1 加载立体模型
3d模型网站
https://sketchfab.com/3d-models/coin-d41feb2c10ed4c06ad4b8134ccaba516 自己上去找模型

加载这个模型到场景中
  1. sceneView.scene = SCNScene(named: "ship.scn", inDirectory: "models.scnassets/ship") ?? SCNScene()
复制代码
2 识别图片
  1.      var images :[UIImage] = []
  2.         for i in 1...19{
  3.             let image = UIImage(named: "AR\(i)")
  4.             images.append(image!)
  5.         }
  6.         configuartion.detectionImages = loadedImagesFromDirectoryContents(images)
  7.   
  8.   
  9.   //其实可以直接加载图片文件的,这样图片直接转ARSet更直接一点
  10.    func loadedImagesFromDirectoryContents(_ images: [UIImage]) -> Set<ARReferenceImage>{
  11.         var index = 0
  12.         var customReferenceSet = Set<ARReferenceImage>()
  13.         images.forEach { (downloadedImage) in
  14.             //1. Convert The UIImage To A CGImage
  15.             guard let cgImage = downloadedImage.cgImage else { return }
  16.             //2. Get The Width Of The Image
  17.             let imageWidth = CGFloat(cgImage.width)
  18.             //3. Create A Custom AR Reference Image With A Unique Name
  19.             let customARReferenceImage = ARReferenceImage(cgImage, orientation: CGImagePropertyOrientation.up, physicalWidth: imageWidth)
  20.             customARReferenceImage.name = "MyCustomARImage\(index)"
  21.             //4. Insert The Reference Image Into Our Set
  22.             customReferenceSet.insert(customARReferenceImage)
  23.             print("ARReference Image == \(customARReferenceImage)")
  24.             index += 1
  25.         }
  26.         //5. Return The Set
  27.         return customReferenceSet
  28.     }
  29.    
  30.    
  31.    
  32.     //在ARSCNViewDelegate方法里
  33.    
  34.      func renderer(_ renderer: any SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
  35.      
  36.         if let imageAnchor = anchor as? ARImageAnchor{
  37.             let image = imageAnchor.referenceImage
  38.             if let imagename = image.name, imagename.hasPrefix("AR"){
  39.                print("识别出来图片")
  40.             }
  41.         }
  42.         
  43.         //加载3d数据识别出来立体物体,具体如下
  44.          if let objectAnchor = anchor as? ARObjectAnchor {
  45.               print("Detected object: \(objectAnchor.referenceObject.name ?? "Unknown")")
  46.               
  47.              }
  48.      }      
  49.         
复制代码
视觉算法 Vision识别
  1. //获取当前会话帧数据
  2.     func getCurrentFrameImage(from session: ARSession) -> UIImage? {
  3.         guard let currentFrame = session.currentFrame else {
  4.             print("当前没有 ARFrame")
  5.             return nil
  6.         }
  7.         let pixelBuffer = currentFrame.capturedImage
  8.         let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
  9.         let context = CIContext()
  10.         guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else {
  11.             return nil
  12.         }
  13.         return UIImage(cgImage: cgImage)
  14.     }
  15.    
  16.    
  17.      func matchImages(image1: UIImage, image2: UIImage, completion: @escaping (Bool) -> Void) {
  18.         guard let cgImage1 = image1.cgImage, let cgImage2 = image2.cgImage else {
  19.             completion(false)
  20.             return
  21.         }
  22.         let request1 = VNGenerateImageFeaturePrintRequest()
  23.         let request2 = VNGenerateImageFeaturePrintRequest()
  24.         
  25.         let request3 = VNDetectRectanglesRequest()
  26.             request3.minimumConfidence = 0.8
  27.             request3.minimumAspectRatio = 0.1
  28.             request3.maximumAspectRatio = 1.0
  29.             request3.quadratureTolerance = 10
  30.         
  31.         let handler1 = VNImageRequestHandler(cgImage: cgImage1, options: [:])
  32.         let handler2 = VNImageRequestHandler(cgImage: cgImage2, options: [:])
  33.         let handler3 = VNImageRequestHandler(cgImage: cgImage1, options: [:])
  34.         do {
  35.             try handler1.perform([request1])
  36.             try handler2.perform([request2])
  37.             try handler3.perform([request3])
  38.             guard let featurePrint1 = request1.results?.first as? VNFeaturePrintObservation,
  39.                   let featurePrint2 = request2.results?.first as? VNFeaturePrintObservation else {
  40.                 completion(false)
  41.                 return
  42.             }
  43.             
  44.             if let observations = request3.results as? [VNRectangleObservation], !observations.isEmpty{
  45.                 // 假设目标区域是第一个匹配的矩形
  46.                 let boundingBox = observations.first?.boundingBox
  47.                 print("boundRext: \(boundingBox)")
  48.             }
  49.             var distance: Float = 0
  50.             try featurePrint1.computeDistance(&distance, to: featurePrint2)
  51.             print("匹配值 \(distance)")
  52.             completion(distance < 0.8) // 设定相似度阈值
  53.         } catch {
  54.             print("匹配失败:\(error)")
  55.             completion(false)
  56.         }
  57.     }
  58.    
  59.     //当前数据和所有图片集对比
  60.     func handleFrame(session: ARSession,frame: ARFrame){
  61.         let i = frame.timestamp - (self.currentFrmae?.timestamp ?? 0)
  62. //        print("time i\(i)")
  63.         if i < 1{
  64.             return
  65.         }
  66.         self.currentFrmae = frame
  67.         guard let frameImg = getCurrentFrameImage(from: session) else{return}
  68.         var isMatched:Bool = false
  69.         for img in self.images{
  70. //            if compareImages(image1: frameImg, image2: img) == 1{
  71. //                isMatched = true
  72. //                break
  73. //            }
  74.             let im1 = frameImg
  75.             let im2 = img
  76.             matchImages(image1: frameImg, image2: img) { [weak self]isok in
  77.                 if isok{
  78.                     DispatchQueue.main.async {
  79.                         self?.showToast()
  80.                     }
  81.                 }
  82.             }
  83.         }
  84.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表