为什么Face检测仅适用于CGImagePropertyOrientation.right?

时间:2017-10-04 19:49:59

标签: ios swift4 apple-vision

我已经在下面的链接上创建了Xcode项目,以便探索Apple使用Xcode9发布的新Vision框架。它基于我在GitHub和Youtube上找到的代码所做的调整,但我不能理解为什么CGImagePropertyOrientation.right在VNImageRequestHandler上的orientation参数上。有人可以对此有所了解吗?

GitHub Xcode project

2 个答案:

答案 0 :(得分:2)

面部检测需要知道所需的面部方向,这通常与图像的预期显示方向相匹配。 (也就是说,大多数人,大部分时间都会拍摄脸部正面朝上的照片。)大多数人脸检测软件(包括Vision)都经过优化,可以寻找正面朝上的脸,因为它很多当你正在寻找任何方向的面孔时,更容易得到误报。

Vision的人脸检测功能更喜欢您指定方向。如果您没有指定一个,AFAICT会使用默认的.up方向。如果您的图像仅在.right指定方向时才能正确识别,则这些图像可能具有EXIF元数据,表明其首选显示方向不一定与捕获它们的原生传感器方向相同。

如果您的图片从存储/网址加载UIImage开始,您可以向图片询问其UIImageOrientation的预期展示方向,并将其转换为CGImagePropertyOrientation以便传递给视觉方法。在Apple的Vision sample code中有一种方法可以做到这一点。

答案 1 :(得分:1)

我已经通过Apple UIImage.imageOrientationCGImagePropertyOrientation的文档找到了我自己的问题的答案。如果其他人遇到同样的问题,请在此处发布: 底线是虽然这两个属性都与图像方向相关,但它们具有分配给其枚举的不同实际值。例如,UIImage.imageOrientation.up将映射到值0,而CGImagePropertyOrientation.up将映射到1。我处理它的方法是构建这个自定义的“翻译”函数,该函数返回从UIImage.imageOrientation输入到相应CGImagePropertyOrientation值的映射:

func getCGOrientationFromUIImage(_ image: UIImage) -> CGImagePropertyOrientation {
    // returns que equivalent CGImagePropertyOrientation given an UIImage.
    // This is required because UIImage.imageOrientation values don't match to CGImagePropertyOrientation values
    switch image.imageOrientation {
    case .down:
        return .down
    case .left:
        return .left
    case .right:
        return .right
    case .up:
        return .up
    case .downMirrored:
        return .downMirrored
    case .leftMirrored:
        return .leftMirrored
    case .rightMirrored:
        return .rightMirrored
    case .upMirrored:
        return .upMirrored
    }
}

GitHub示例已更新。无论拍摄照片的方向是什么,现在都会识别面部。