전 카메라가 얼굴을 감지 할 수있는 간단한 카메라 응용 프로그램을 만들려고합니다. 이 충분히 단순해야한다 :iOS 카메라 파편 추적 (Swift 3 Xcode 8)
가있는 UIImage에서 상속 CameraView 클래스를 생성하고 UI에 넣습니다. 카메라의 프레임을 실시간으로 처리하려면 AVCaptureVideoDataOutputSampleBufferDelegate를 구현해야합니다. CameraView가 인스턴스화 될 때 호출 함수 handleCamera 내
class CameraView: UIImageView, AVCaptureVideoDataOutputSampleBufferDelegate
- , 설치 AVCapture 세션. 카메라에서 입력을 추가하십시오.
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") }
설정 카메라 미리보기와는 세션 대리인에 의해 실행 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()
를 실행 얼굴을 인식하기 위해 CIImage에 받았다 샘플 버퍼를 변환합니다. 얼굴이 발견되면 피드백을주십시오.
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를 얻을 수 없었습니다 실행 카메라를 얻을 수 있습니다. 응용 프로그램이 함수를 입력하지 않거나 작동하지 않는 varible로 인해 충돌합니다. 가장 자주 sampleBuffer 변수가 nul입니다. 내가 뭘 잘못하고 있니?
저는 실제로 인턴쉽에서 iOS 개발자의 도움을 받아 이것을 발견했으며 질문을 잊어 버렸습니다. 이것은 실제로 누락 된 모든 것이 었습니다. 조사해 주셔서 감사 드리며 희망적으로 다른 사람을 도울 것입니다. – KazToozs