2017-04-13 22 views
4

フロントカメラが顔を検出できる簡単なカメラアプリケーションを作ろうとしています。 これは十分に単純でなければなりません:iOSカメラの顔検出(Swift 3 Xcode 8)

  • はUIImageから継承CameraViewクラスを作成し、UIに配置します。カメラのフレームをリアルタイムで処理するには、AVCaptureVideoDataOutputSampleBufferDelegateを実装していることを確認してください。セットアップAVCaptureセッションCameraViewがインスタンス化されたときに呼び出される関数handleCamera、内

    class CameraView: UIImageView, AVCaptureVideoDataOutputSampleBufferDelegate 
    
  • 。カメラからの入力を追加します。

    override init(frame: CGRect) { 
        super.init(frame:frame) 
    
        handleCamera() 
    } 
    
    func handleCamera() { 
        camera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, 
                  mediaType: AVMediaTypeVideo, position: .front) 
        session = AVCaptureSession() 
    
        // Set recovered camera as an input device for the capture session 
        do { 
         try input = AVCaptureDeviceInput(device: camera); 
        } catch _ as NSError { 
         print ("ERROR: Front camera can't be used as input") 
         input = nil 
        } 
    
        // Add the input from the camera to the capture session 
        if (session?.canAddInput(input) == true) { 
         session?.addInput(input) 
        } 
    
  • 出力を作成します。 AVCaptureVideoDataOutputSampleBufferDelegate(この場合はクラス自体)によって処理されるデータを渡すためのシリアル出力キューを作成します。セッションに出力を追加します。

    output = AVCaptureVideoDataOutput() 
    
        output?.alwaysDiscardsLateVideoFrames = true  
        outputQueue = DispatchQueue(label: "outputQueue") 
        output?.setSampleBufferDelegate(self, queue: outputQueue) 
    
        // add front camera output to the session for use and modification 
        if(session?.canAddOutput(output) == true){ 
         session?.addOutput(output) 
        } // front camera can't be used as output, not working: handle error 
        else { 
         print("ERROR: Output not viable") 
        } 
    
  • セットアップカメラプレビュービューと顔を検出するためにCIImageに受け取っサンプルバッファーを変換、代理人によって実行captureOutput機能に

    // Setup camera preview with the session input 
        previewLayer = AVCaptureVideoPreviewLayer(session: session) 
        previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
        previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
        previewLayer?.frame = self.bounds 
        self.layer.addSublayer(previewLayer!) 
    
        // Process the camera and run it onto the preview 
        session?.startRunning() 
    
  • セッションを実行します。顔が見つかった場合、フィードバックを返します。

    func captureOutput(_ captureOutput: AVCaptureOutput!, didDrop sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
    
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
    let cameraImage = CIImage(cvPixelBuffer: pixelBuffer!) 
    
    
    let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] 
    let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) 
    let faces = faceDetector?.features(in: cameraImage) 
    
    for face in faces as! [CIFaceFeature] { 
    
         print("Found bounds are \(face.bounds)") 
    
         let faceBox = UIView(frame: face.bounds) 
    
         faceBox.layer.borderWidth = 3 
         faceBox.layer.borderColor = UIColor.red.cgColor 
         faceBox.backgroundColor = UIColor.clear 
         self.addSubview(faceBox) 
    
         if face.hasLeftEyePosition { 
          print("Left eye bounds are \(face.leftEyePosition)") 
         } 
    
         if face.hasRightEyePosition { 
          print("Right eye bounds are \(face.rightEyePosition)") 
         } 
        } 
    } 
    

私の問題:私は、私はすべてインターネット上から試してみました異なるコードの多くで、私は顔を検出するcaptureOutputを取得することができたことはありません実行されているカメラを得ることができます。アプリケーションが機能に入っていないか、動作しない変数が原因でクラッシュします。最も頻繁には、sampleBuffer変数がnulです。 私は何が間違っていますか?

答えて

1

は、次のおcaptureOutput関数の引数を変更する必要があります。バッファは、それはカメラから取得しない場合は、低下したときにfunc captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!)

あなたcaptureOutput関数が呼び出されます。

+0

私は実際にインターンシップのiOS開発者の助けを借りてこれを見つけましたが、質問を更新するのを忘れました。 これは事実上欠けていたすべてでした。見ていただきありがとうございました。うまくいけば、これは他の誰かを助けるでしょう。 – KazToozs

関連する問題