1

我在下面的链接中创建了 Xcode 项目,以便探索 Apple 使用 Xcode9 发布的新视觉框架。它基于对我在 GitHub 和 Youtube 上找到的代码所做的调整,但我不明白为什么 CGImagePropertyOrientation.right 在 VNImageRequestHandler 的方向参数上。有人可以解释一下吗?

GitHub Xcode 项目

4

2 回答 2

4

UIImage.imageOrientation通过 Apple 在和上的文档,我找到了我自己问题的答案CGImagePropertyOrientation。在这里发布它以防其他人遇到同样的问题:底线是虽然这两个属性都与图像方向有关,但它们的枚举分配了不同的实际值。例如,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 示例已更新。现在,无论使用哪个方向拍照,都可以识别人脸。

于 2017-10-04T21:11:46.780 回答
3

人脸检测需要了解所需的人脸方向,这通常与图像的预期显示方向相匹配。(也就是说,大多数人,大多数时候,都在人脸正面朝上的地方拍照。)大多数人脸检测软件,包括视觉,都经过优化,可以寻找正面朝上的人脸,因为它更容易获得当您寻找任何方向的面孔时会出现误报。

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

如果您的图像是UIImage从 storage/URL 加载的,您可以询问图像其预期的显示方向是什么 UIImageOrientation,并将其转换CGImagePropertyOrientation为传递给 Vision 方法。在 Apple 的Vision 示例代码中有一种方法可以做到这一点。

于 2017-10-04T21:12:52.623 回答