2017-11-13 6 views
2

私は、画像内の顔を検出するには、このシンプルな機能を持っている:トラック面オブジェクト+ビジョンAPI iOS11

func detectFacesForImage(image: UIImage) 
    { 
     guard let ciImage = CIImage(image: image) else { 
      return 
     } 

     let request = VNDetectFaceRectanglesRequest { [unowned self] request, error in 
      guard let observations = request.results as? [VNFaceObservation] else { 
       return 
      } 
     } 
     let handler = VNImageRequestHandler(ciImage: ciImage, options: [:]) 
     do 
     { 
      try handler.perform([request]) 
     } 
     catch 
     { 
      [HANDLE ERROR HERE] 
     } 
    } 

は、今、私たちはVNFaceObservationオブジェクトを含むobservationsリストを持っています。これらのオブジェクトをVNDetectedObjectObservationオブジェクトに変換するには、次の関数を使用しています。

func convertFaceObservationsToDetectedObjects(with observations: [VNFaceObservation]) 
    { 
     observations.forEach { observation in 
      let boundingBox = observation.boundingBox 
      let size = CGSize(width: boundingBox.width * self.IMG_VIEW.bounds.width, 
           height: boundingBox.height * self.IMG_VIEW.bounds.height) 
      let origin = CGPoint(x: boundingBox.minX * self.IMG_VIEW.bounds.width, 
           y: (1 - observation.boundingBox.minY) * self.IMG_VIEW.bounds.height - size.height) 
      let originalRect = CGRect(origin: origin, size: size) 

      var convertedRect = cameraLayer.metadataOutputRectConverted(fromLayerRect: originalRect) 
      convertedRect.origin.y = 1 - convertedRect.origin.y 
      let trackingObservation = VNDetectedObjectObservation(boundingBox: convertedRect) 

      self.anotherListOfObservations.append((tag, trackingObservation)) 
     } 
    } 

は、私は与えられた VNDetectedObjectObservationオブジェクトを試してみて、追跡するために、このデリゲートの機能を使用しています:

extension MyViewController: AVCaptureVideoDataOutputSampleBufferDelegate { 

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) 
    { 
     guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { 
       return 
     } 
     var listOfRequests:[VNTrackObjectRequest] = [] 
     for (_, observation) in self.anotherListOfObservations 
     { 
      let request = VNTrackObjectRequest(detectedObjectObservation: observation) { [unowned self] request, error in 
       self.handle(request, error: error) 
      } 

      request.trackingLevel = .accurate 
      listOfRequests.append(request) 
     } 

     do { 
      try handler.perform(listOfRequests, on: pixelBuffer) 
     } 
     catch { 
      print(error) 
     } 
    } 
} 

私の質問は:それは本当に可能ですか?またはそれをすべて間違っている?

答えて

関連する問題