VNFaceObservation BoundingBox在纵向模式下不缩放

时间:2017-07-17 18:29:07

标签: ios swift core-graphics apple-vision

供参考,这源于 Vision API 中的问题。我正在努力使用 Vision 通过VNDetectFaceRectanglesRequest检测图像中的面部,这在确定图像中正确的面数并提供{{1}方面成功运作对于每张脸。

我的问题是,由于我的boundingBox(保留了UIImageView有问题)使用的是UIImage内容模式,因此我无法正确绘制边界框肖像模式(事物在景观中很有效)。

这是我的代码;

.scaleAspectFit


这是我所看到的最终结果,请注意这些框在 X 位置是正确的,但在纵向时它们的 Y 位置基本上不准确。

**人像中的错误放置** Incorrect Placement In Portrait

**景观中的正确位置** Correct Placement In Landscape

2 个答案:

答案 0 :(得分:1)

VNFaceObservation边界框被标准化为已处理图像。来自文档。

  

检测到的对象的边界框。坐标标准化为   已处理图像的尺寸,原点位于图像处   左下角。

因此,您可以使用简单的计算为检测到的面部找到正确的尺寸/框架,如下所示。

let boundingBox = observation.boundingBox
let size = CGSize(width: boundingBox.width * imageView.bounds.width,
                  height: boundingBox.height * imageView.bounds.height)
let origin = CGPoint(x: boundingBox.minX * imageView.bounds.width,
                     y: (1 - observation.boundingBox.minY) * imageView.bounds.height - size.height)

然后您可以形成CAShapeLayer rect,如下所示

layer.frame = CGRect(origin: origin, size: size)

答案 1 :(得分:0)

我认为您必须为CIImage提供正确的方向,同时发送以处理和检测面部。正如@Pawel Chmiel在blog post中提到的那样:

  

这里重要的是我们需要提供正确的方向,因为此时面部检测非常敏感,旋转的图像可能不会产生任何结果。

 let ciImage = CIImage(cvImageBuffer: pixelBuffer!, options: attachments as! [String : Any]?)

 //leftMirrored for front camera
 let ciImageWithOrientation = ciImage.applyingOrientation(Int32(UIImageOrientation.leftMirrored.rawValue))
  

对于前置摄像头,我们必须使用leftMirrored方向