相机在启动情绪检测器时冻结
Camera Freezes on starting emotion detector
嘿,我正在使用 Affectiva Affdex ios SDK。现在我有2个观点。
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)
}
}
}
}
我正在启动检测器的另一个 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)
返回的图像。
另一种方法是创建相机会话,然后自己将图像传递给检测器。
像这样初始化你的检测器
EMDetector = AFDXDetector(delegate: self, discreteImages: false, maximumFaces: 2, face: LARGE_FACES)
然后使用
将捕获会话中的图像传递到检测器
EMDetector.processImage(UIImage!, atTime: TimeInterval)
嘿,我正在使用 Affectiva Affdex ios SDK。现在我有2个观点。
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) } } } }
我正在启动检测器的另一个 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)
返回的图像。
另一种方法是创建相机会话,然后自己将图像传递给检测器。
像这样初始化你的检测器
EMDetector = AFDXDetector(delegate: self, discreteImages: false, maximumFaces: 2, face: LARGE_FACES)
然后使用
将捕获会话中的图像传递到检测器EMDetector.processImage(UIImage!, atTime: TimeInterval)