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