2017-09-01 2 views
1

Je crée un appareil photo personnalisé avec des filtres. Lorsque j'ajoute la ligne suivante, il se bloque sans montrer d'exception.Google Face Detection se bloque lors de la conversion en image et en essayant de détecter le visage

// Réglage de la sortie vidéo

func setupBuffer() { 
    videoBuffer = AVCaptureVideoDataOutput() 
    videoBuffer?.alwaysDiscardsLateVideoFrames = true 
    videoBuffer?.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString): NSNumber(value: kCVPixelFormatType_32RGBA)] 
    videoBuffer?.setSampleBufferDelegate(self, queue: DispatchQueue.main) 
    captureSession?.addOutput(videoBuffer) 
} 


public func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 

    if connection.videoOrientation != .portrait { 
     connection.videoOrientation = .portrait 
    } 
     guard let image = GMVUtility.sampleBufferTo32RGBA(sampleBuffer) else { 
      print("No Image ") 
      return 
     } 

    pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
    ciImage = CIImage(cvImageBuffer: pixelBuffer!, options: CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate)as! [String : Any]?) 

    CameraView.filter = CIFilter(name: "CIPhotoEffectProcess") 
    CameraView.filter?.setValue(ciImage, forKey: kCIInputImageKey) 
    let cgimg = CameraView.context.createCGImage(CameraView.filter!.outputImage!, from: ciImage.extent) 

    DispatchQueue.main.async { 
     self.preview.image = UIImage(cgImage: cgimg!) 
    } 
} 

Mais il s'écraser sur -

guard let image = GMVUtility.sampleBufferTo32RGBA(sampleBuffer) else { 
       print("No Image ") 
       return 
      } 

Quand je passe l'image qui est créée à partir CIImage, il ne reconnaît pas le visage dans l'image. fichier de code complet est https://www.dropbox.com/s/y1ewd1sh18h3ezj/CameraView.swift.zip?dl=0

enter image description here

+0

Vous devez mettre en place un point d'arrêt d'exception pour attraper le message d'erreur exact. –

+0

J'ai ajouté cela, mais il plante quelque part dans le cadre. Je n'ai pas accès au code. – ChanWarde

+0

Avez-vous déterminé si le problème concerne le cadre lui-même ou la façon dont vous appelez le cadre? Essayez d'exécuter l'un des exemples d'applications pour le framework. –

Répondre

0

1) Créer file d'attente distincte pour le tampon.

fileprivate var videoDataOutputQueue = DispatchQueue(label: "VideoDataOutputQueue") 

2) tampon d'installation avec cette

 let videoBuffer = AVCaptureVideoDataOutput() 
     videoBuffer?.alwaysDiscardsLateVideoFrames = true 
     videoBuffer?.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString): NSNumber(value: kCVPixelFormatType_32BGRA)] 
     videoBuffer?.setSampleBufferDelegate(self, queue: videoDataOutputQueue) // 
     captureSession?.addOutput(videoBuffer)