iOS为CIDetector获取正确的CMSampleBuffer方向

时间:2016-05-29 09:29:05

标签: ios swift cidetector

我正在阅读来自用户相机胶卷的一堆视频,每个视频都是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并将该图像方向传递到检测器中,则在应该有面部的地方没有检测到面部。此外,当我将样本缓冲区转换为图像时,无论视频如何,方向始终相同。这让我觉得视频定位没有得到保留?

如何获得适当的方向值以便进行面部检测?

0 个答案:

没有答案