2017-09-01 24 views
1

私はフィルタを備えたカスタムカメラを作成しています。次の行を追加すると、例外を表示せずにクラッシュします。画像に変換して顔を検出しようとすると、Google顔検出がクラッシュする

//ビデオ出力

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

を設定する。しかし、それは上のクラッシュだ -

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

を私はCIImageから作成された画像を渡すと、それが画像中の顔を認識しません。 完全なコードファイルは、https://www.dropbox.com/s/y1ewd1sh18h3ezj/CameraView.swift.zip?dl=0

enter image description here

+0

でセットアップバッファ。 –

+0

私はそれを追加しましたが、フレームワークのどこかでクラッシュしています。コードにアクセスすることはできません。 – ChanWarde

+0

問題がフレームワーク自体にあるのか、それともフレームワークを呼び出す方法であるのかを判断しましたか?フレームワークのサンプルアプリケーションの1つを実行してみてください。 –

答えて

0

1である)のバッファ用に別のキューを作成します。

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

2)あなたは、正確なエラーメッセージをキャッチする例外ブレークポイントを設定する必要があり、この

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