我正在阅读来自用户相机胶卷的一堆视频,每个视频都是一个CMSampleBuffer
s 列表,我想在每一帧上执行人脸检测。
我的检测方法如下:
首先,我确保缓冲区有效。然后我将缓冲区转换为 aCIImage
最后,用于CIDetector
运行人脸检测。
private func facesInBuffer(buffer: CMSampleBuffer) -> [CIFaceFeature] {
guard let imageBuffer = CMSampleBufferGetImageBuffer(buffer) else {
return []
}
let image = CIImage(CVImageBuffer: imageBuffer)
let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorTracking: true])
guard let features = detector.featuresInImage(image) as? [CIFaceFeature] where !features.isEmpty else {
return []
}
return features
}
由于我正在从相机胶卷中读取这些视频,因此方向可能会根据视频的录制方式而发生很大变化。而且因为想要最好的检测结果,所以必须通过CIDetectorImageOrientation
.
我目前有这个扩展:
extension UIImage {
var coreImageOrientation: CGImagePropertyOrientation {
switch self.imageOrientation {
case .Up: return .Up
case .UpMirrored: return .UpMirrored
case .Down: return .Down
case .DownMirrored: return .DownMirrored
case .Left: return .Left
case .LeftMirrored: return .LeftMirrored
case .Right: return .Right
case .RightMirrored: return .RightMirrored
}
}
}
但是,如果我将缓冲区转换为 aUIImage
并将该图像方向传递给检测器,则在应该有人脸的地方不会检测到人脸。此外,当我将样本缓冲区转换为图像时,无论视频如何,方向总是相同的。这让我觉得视频方向没有得到保留?
如何获得适当的方向值以便人脸检测起作用?