2

我正在阅读来自用户相机胶卷的一堆视频,每个视频都是一个CMSampleBuffers 列表,我想在每一帧上执行人脸检测。

我的检测方法如下:

首先,我确保缓冲区有效。然后我将缓冲区转换为 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并将该图像方向传递给检测器,则在应该有人脸的地方不会检测到人脸。此外,当我将样本缓冲区转换为图像时,无论视频如何,方向总是相同的。这让我觉得视频方向没有得到保留?

如何获得适当的方向值以便人脸检测起作用?

4

0 回答 0