我正在阅读来自用户相机胶卷的一堆视频,每个视频都是CMSampleBuffer
的列表,我想在每个帧上执行面部检测。
我的检测方法如下:
首先,我确保缓冲区有效。然后我将缓冲区转换为CIImage
,最后使用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
}
}
}
但是如果我将我的缓冲区转换为UIImage
并将该图像方向传递到检测器中,则在应该有面部的地方没有检测到面部。此外,当我将样本缓冲区转换为图像时,无论视频如何,方向始终相同。这让我觉得视频定位没有得到保留?
如何获得适当的方向值以便进行面部检测?