我在下面的链接中创建了 Xcode 项目,以便探索 Apple 使用 Xcode9 发布的新视觉框架。它基于对我在 GitHub 和 Youtube 上找到的代码所做的调整,但我不明白为什么 CGImagePropertyOrientation.right 在 VNImageRequestHandler 的方向参数上。有人可以解释一下吗?
2 回答
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 示例已更新。现在,无论使用哪个方向拍照,都可以识别人脸。
人脸检测需要了解所需的人脸方向,这通常与图像的预期显示方向相匹配。(也就是说,大多数人,大多数时候,都在人脸正面朝上的地方拍照。)大多数人脸检测软件,包括视觉,都经过优化,可以寻找正面朝上的人脸,因为它更容易获得当您寻找任何方向的面孔时会出现误报。
Vision 的人脸检测功能更喜欢您指定方向。.up
AFAICT如果您根本不指定,他们会使用默认方向。如果您的图像仅.right
在指定方向时才能正确识别,则这些图像可能具有 EXIF 元数据,表明它们的首选显示方向不一定与捕获它们的本机传感器方向相同。
如果您的图像是UIImage
从 storage/URL 加载的,您可以询问图像其预期的显示方向是什么 UIImageOrientation
,并将其转换CGImagePropertyOrientation
为传递给 Vision 方法。在 Apple 的Vision 示例代码中有一种方法可以做到这一点。