供参考,这源于 Vision API 中的问题。我正在努力使用 Vision 通过VNDetectFaceRectanglesRequest
检测图像中的面部,这在确定图像中正确的面数并提供{{1}方面成功运作对于每张脸。
我的问题是,由于我的boundingBox
(保留了UIImageView
有问题)使用的是UIImage
内容模式,因此我无法正确绘制边界框肖像模式(事物在景观中很有效)。
这是我的代码;
.scaleAspectFit
这是我所看到的最终结果,请注意这些框在 X 位置是正确的,但在纵向时它们的 Y 位置基本上不准确。
答案 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方向