Камера зависает при запуске детектора эмоций

Привет, я использую 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 места на экране.

Проблема:

Всякий раз, когда я пытаюсь запустить приложение, поток камеры зависает через одну секунду. И это потому, что детектор запускается. Теперь, если вы посмотрите пример приложения github (https://github.com/Affectiva/affdexme-ios/tree/master/apps/AffdexMe), также доступный в магазине приложений. вид с камеры все еще включен, даже когда они обнаруживают эмоцию.

Я даже пытался объединить две функции, а затем вызвать функцию, но каким-то образом одна функция отменяет другую.

как это обойти?

Спасибо


person Aakash Dave    schedule 11.11.2017    source источник


Ответы (1)


Проблема в том, что вы создаете сеанс захвата для первого просмотра, а 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)

person Moraly    schedule 13.11.2017
comment
эй большое спасибо за ответ. Я действительно нуждался в решении. У меня возник вопрос. Если я пойду по первому пути, мне нужно определить метод делегата и другие обработанные методы изображения в обоих представлениях - person Aakash Dave; 13.11.2017
comment
Что вы имеете в виду, определяя метод делегата в обоих представлениях? У вашего детектора должен быть только один делегат, а затем передать изображение обоим представлениям. - person Moraly; 13.11.2017
comment
Привет! я использую другой способ передачи изображения на детектор через сеанс камеры. Он не может найти лица на изображениях. В чем тут может быть дело? - person Aakash Dave; 06.12.2017