相机在启动情绪检测器时冻结

Camera Freezes on starting emotion detector

嘿,我正在使用 Affectiva Affdex ios SDK。现在我有2个观点。

  1. UIView -> 其中我 运行 相机流。同样的代码在这里:

    func allConfig(withCamView cams:UIView) {
    
    let captureDevice = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .unspecified)
    
    for device in (captureDevice?.devices)! {
    
        if device.position == .front{
    
            do {
                let input = try AVCaptureDeviceInput(device: device)
    
                if session.canAddInput(input) {
                    session.addInput(input)
                }
    
                if session.canAddOutput(previewOutput) {
                    session.addOutput(previewOutput)
                }
    
                previewLayer = AVCaptureVideoPreviewLayer(session: session)
                previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
                previewLayer.connection.videoOrientation = .portrait
    
                cams.layer.addSublayer(previewLayer)
    
                previewLayer.position = CGPoint(x: cams.frame.width/2, y: cams.frame.height/2)
                previewLayer.bounds = cams.frame
    
    
                session.startRunning()
    
    
            } catch let avError {
                print(avError)
            }
        }
    }
    
    }
    
  2. 我正在启动检测器的另一个 UICollectionView 单元格。代码在这里:

     func createDetector() {
    destroyDetector()
    let captureDevice = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .unspecified)
    for device in (captureDevice?.devices)! {
    
        if device.position == .front{
            EMDetector = AFDXDetector(delegate: self, using: device, maximumFaces: 2, face: LARGE_FACES)
            EMDetector.maxProcessRate = 5
    
            // turn on all classifiers (emotions, expressions, and emojis)
            EMDetector.setDetectAllExpressions(true)
            EMDetector.setDetectAllEmotions(true)
            EMDetector.setDetectAllAppearances(true)
            EMDetector.setDetectEmojis(true)
    
            // turn on gender and glasses
            EMDetector.gender = true
            EMDetector.glasses = true
    
    
    
            // start the detector and check for failure
            let error: Error? = EMDetector.start()
            if nil != error {
                print("Some Faliure in detector")
                print("root cause of error ------------------------- > \(error.debugDescription)")
            }
        }
    }
    
    }
    

这些视图占用 50-50 个屏幕 space。

问题:

每当我尝试 运行 应用程序时,相机流会在一秒钟后冻结。那是因为探测器启动了。 现在,如果您查看 github 示例应用程序 (https://github.com/Affectiva/affdexme-ios/tree/master/apps/AffdexMe),也可以在应用程序商店中找到。即使他们正在检测情绪,相机视图仍然打开。

我什至尝试合并这两个函数然后调用该函数,但不知何故一个函数取消了另一个。

解决这个问题的方法是什么?

谢谢

问题是您正在为第一个视图创建捕获会话,而 SDK 创建另一个会话来处理相机输入。您不能同时进行多个会话 运行。

解决此问题的一种方法是在两个视图中使用从委托方法 func detector(_ detector: AFDXDetector!, hasResults faces: NSMutableDictionary!, for image: UIImage!, atTime time: TimeInterval) 返回的图像。

另一种方法是创建相机会话,然后自己将图像传递给检测器。

  1. 像这样初始化你的检测器

    EMDetector = AFDXDetector(delegate: self, discreteImages: false, maximumFaces: 2, face: LARGE_FACES)

  2. 然后使用

    将捕获会话中的图像传递到检测器

    EMDetector.processImage(UIImage!, atTime: TimeInterval)