フロントカメラが顔を検出できる簡単なカメラアプリケーションを作ろうとしています。 これは十分に単純でなければなりません: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です。 私は何が間違っていますか?
私は実際にインターンシップのiOS開発者の助けを借りてこれを見つけましたが、質問を更新するのを忘れました。 これは事実上欠けていたすべてでした。見ていただきありがとうございました。うまくいけば、これは他の誰かを助けるでしょう。 – KazToozs