gpt4 book ai didi

ios - VNFaceObservation BoundingBox 在纵向模式下不缩放

转载 作者:行者123 更新时间:2023-11-28 12:20:06 24 4
gpt4 key购买 nike

作为引用,这源于 Vision API 中的一个问题。我正在努力使用 Vision 通过 VNDetectFaceRectanglesRequest 检测图像中的人脸,它在确定图像中正确的人脸数量和提供 方面成功运行code>boundingBox 每张脸。

我的问题是,由于我的 UIImageView(其中包含有问题的 UIImage)正在使用 .scaleAspectFit 内容模式,我在纵向模式下正确绘制边界框非常困难(在横向模式下效果很好)。

这是我的代码;

func detectFaces(image: UIImage) {

let detectFaceRequest = VNDetectFaceRectanglesRequest { (request, error) in
if let results = request.results as? [VNFaceObservation] {
for faceObservation in results {
let boundingRect = faceObservation.boundingBox

let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -self.mainImageView.frame.size.height)
let translate = CGAffineTransform.identity.scaledBy(x: self.mainImageView.frame.size.width, y: self.mainImageView.frame.size.height)
let facebounds = boundingRect.applying(translate).applying(transform)

let mask = CAShapeLayer()
var maskLayer = [CAShapeLayer]()
mask.frame = facebounds

mask.backgroundColor = UIColor.yellow.cgColor
mask.cornerRadius = 10
mask.opacity = 0.3
mask.borderColor = UIColor.yellow.cgColor
mask.borderWidth = 2.0

maskLayer.append(mask)
self.mainImageView.layer.insertSublayer(mask, at: 1)
}
}

let vnImage = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try? vnImage.perform([detectFaceRequest])

}


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

** 纵向放置不正确** Incorrect Placement In Portrait

** 横向正确放置** Correct Placement In Landscape

最佳答案

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

The bounding box of detected object. The coordinates are normalized to the dimensions of the processed image, with the origin at the image's lower-left corner.

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

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矩形

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

关于ios - VNFaceObservation BoundingBox 在纵向模式下不缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45151218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com