2017-04-13 5 views
4

전 카메라가 얼굴을 감지 할 수있는 간단한 카메라 응용 프로그램을 만들려고합니다. 이 충분히 단순해야한다 :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입니다. 내가 뭘 잘못하고 있니?

답변

1

는 다음에 captureOutput 함수 인수를 변경해야 버퍼가 카메라에서 도착하지 않을 경우, 떨어질 때 func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!)

귀하의 captureOutput 함수를 호출합니다.

+0

저는 실제로 인턴쉽에서 iOS 개발자의 도움을 받아 이것을 발견했으며 질문을 잊어 버렸습니다. 이것은 실제로 누락 된 모든 것이 었습니다. 조사해 주셔서 감사 드리며 희망적으로 다른 사람을 도울 것입니다. – KazToozs