gpt4 book ai didi

ios - 如何从 VNFaceObservation boundingBox (Vision + ARKit) 正确转换 X 轴

转载 作者:行者123 更新时间:2023-11-28 11:39:36 28 4
gpt4 key购买 nike

我正在使用 ARKit 和 Vision,遵循 Apple 的示例项目“通过 ARKit 实时使用 Vision”。所以我没有设置相机,因为 ARKit 会帮我处理。

使用 Vision 的 VNDetectFaceRectanglesRequest,我能够取回 VNFaceObservation 对象的集合。

按照各种在线指南,我能够将 VNFaceObservation 的边界框转换为我可以在 ViewController 的 UIView 上使用的边界框。

在 ARKit 中放置在我的 UIView 上时,Y 轴是正确的,但 X 轴完全偏离且不准确。

// face is an instance of VNFaceObservation  
let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -view.frame.height)
let translate = CGAffineTransform.identity.scaledBy(x: view.frame.width, y: view.frame.height)
let rect = face.boundingBox.applying(translate).applying(transform)

在屏幕上(在 ARKit/UIKit 中)显示 boundingBox 以使 X 轴和 Y 轴与检测到的面部矩形正确匹配的正确方法是什么?我不能使用 self.cameraLayer.layerRectConverted(fromMetadataOutputRect: transformedRect) 因为我没有使用 AVCaptureSession。


更新:进一步研究,相机的图像是 1920 x 1440。大部分图像不会显示在 ARKit 的屏幕空间上。 iPhone XS 屏幕为 375 x 812 点。

在获得 Vision 的观察 boundingBox 后,我将其转换为适合当前 View (375 x 812)。这不起作用,因为实际宽度似乎是 500(左右两侧不在屏幕 View 中)。我如何从 375x812 CGAffineTransform CGRect 边界框(看起来像 500x812,总的猜测)?

最佳答案

这里缺少的关键部分是 ARFrame 的 displayTransform(for:viewportSize:)。您可以阅读它的文档 here .

此函数将为给定的帧和视口(viewport)大小(您在其中显示图像和边界框的 View 的 CGRect)生成适当的变换。

func visionTransform(frame: ARFrame, viewport: CGRect) -> CGAffineTransform {
let orientation = UIApplication.shared.statusBarOrientation
let transform = frame.displayTransform(for: orientation,
viewportSize: viewport.size)
let scale = CGAffineTransform(scaleX: viewport.width,
y: viewport.height)

var t = CGAffineTransform()
if orientation.isPortrait {
t = CGAffineTransform(scaleX: -1, y: 1)
t = t.translatedBy(x: -viewport.width, y: 0)
} else if orientation.isLandscape {
t = CGAffineTransform(scaleX: 1, y: -1)
t = t.translatedBy(x: 0, y: -viewport.height)
}

return transform.concatenating(scale).concatenating(t)
}

然后你可以像这样使用它:

let transform = visionTransform(frame: yourARFrame, viewport: yourViewport)
let rect = face.boundingBox.applying(transform)

关于ios - 如何从 VNFaceObservation boundingBox (Vision + ARKit) 正确转换 X 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54061482/

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