- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用 ARSessionDelegate
处理 ARKit 中的原始相机图像时...
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let currentFrame = session.currentFrame else { return }
let capturedImage = currentFrame.capturedImage
debugPrint("Display size", UIScreen.main.bounds.size)
debugPrint("Camera frame resolution", CVPixelBufferGetWidth(capturedImage), CVPixelBufferGetHeight(capturedImage))
// ...
}
...如文档所述,相机图像数据与屏幕尺寸不匹配,例如,在 iPhone X 上我得到:
现在有 displayTransform(for:viewportSize:)将相机坐标转换为 View 坐标的 API。像这样使用 API 时:
let ciimage = CIImage(cvImageBuffer: capturedImage)
let transform = currentFrame.displayTransform(for: .portrait, viewportSize: UIScreen.main.bounds.size)
var transformedImage = ciimage.transformed(by: transform)
debugPrint("Transformed size", transformedImage.extent.size)
我得到的尺寸为 2340x1920,这似乎不正确,结果的纵横比应为 375:812 (~0.46)。我在这里错过了什么/使用此 API 将相机图像转换为“由 ARSCNView 显示”的图像的正确方法是什么?
(示例项目:ARKitCameraImage)
最佳答案
事实证明这很复杂,因为 displayTransform(for:viewportSize)
需要归一化的图像坐标,看起来你只需要在纵向模式下翻转坐标并且图像不仅需要转换但也被裁剪了。下面的代码对我有用。我们将不胜感激如何改进这一点的建议。
guard let frame = session.currentFrame else { return }
let imageBuffer = frame.capturedImage
let imageSize = CGSize(width: CVPixelBufferGetWidth(imageBuffer), height: CVPixelBufferGetHeight(imageBuffer))
let viewPort = sceneView.bounds
let viewPortSize = sceneView.bounds.size
let interfaceOrientation : UIInterfaceOrientation
if #available(iOS 13.0, *) {
interfaceOrientation = self.sceneView.window!.windowScene!.interfaceOrientation
} else {
interfaceOrientation = UIApplication.shared.statusBarOrientation
}
let image = CIImage(cvImageBuffer: imageBuffer)
// The camera image doesn't match the view rotation and aspect ratio
// Transform the image:
// 1) Convert to "normalized image coordinates"
let normalizeTransform = CGAffineTransform(scaleX: 1.0/imageSize.width, y: 1.0/imageSize.height)
// 2) Flip the Y axis (for some mysterious reason this is only necessary in portrait mode)
let flipTransform = (interfaceOrientation.isPortrait) ? CGAffineTransform(scaleX: -1, y: -1).translatedBy(x: -1, y: -1) : .identity
// 3) Apply the transformation provided by ARFrame
// This transformation converts:
// - From Normalized image coordinates (Normalized image coordinates range from (0,0) in the upper left corner of the image to (1,1) in the lower right corner)
// - To view coordinates ("a coordinate space appropriate for rendering the camera image onscreen")
// See also: https://developer.apple.com/documentation/arkit/arframe/2923543-displaytransform
let displayTransform = frame.displayTransform(for: interfaceOrientation, viewportSize: viewPortSize)
// 4) Convert to view size
let toViewPortTransform = CGAffineTransform(scaleX: viewPortSize.width, y: viewPortSize.height)
// Transform the image and crop it to the viewport
let transformedImage = image.transformed(by: normalizeTransform.concatenating(flipTransform).concatenating(displayTransform).concatenating(toViewPortTransform)).cropped(to: viewPort)
关于ios - 将 ARFrame#capturedImage 转换为 View 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58809070/
我有一个 ARSession使用 ARWorldTrackingConfiguration作为其配置的一部分。我还通过以下方式启用了面部跟踪: configuration.userFaceTracki
我有一个 ARKit 应用程序,我需要在其中获取当前 ARFrame 对象的 capturedImage 并将其用于进一步处理。我的代码大致如下所示: guard let frame = sceneV
在 ARKit 中,ARFrame.timestamp是一个 TimeInterval,其值如下 185726.884258291 185726.91759425 185726.950930291 .
我是 iPhone 应用程序开发的新手(但在其他语言方面经验丰富),我正在制作一个 ARKit 应用程序,我需要在其中跟踪图像的位置并在该图像周围显示一个矩形。 我可以在 C++ 中使用 OpenCV
ARFrame 中的 CapturedImage 是横向/横向的。如何将其更改为纵向? 谢谢 最佳答案 There's an API for that. ARFrame。 displayTransfo
我想检测球并让 AR 模型与之交互。我使用 opencv 进行球检测并发送球中心,我可以在 hitTest 中使用它来获取 sceneView 中的坐标。我一直在使用以下函数将 CVPixelBuff
我在 ARSCNView 中添加了一个 SCNNode: func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor)
当使用 ARSessionDelegate 处理 ARKit 中的原始相机图像时... func session(_ session: ARSession, didUpdate frame: ARFr
我想使用 ARKit 从图像中获取光照估计。我能够从视频中的帧中检索光估计值。 var SceneView = new ARSCNView(); var arConfig = new ARKit.AR
当模式为自动时,我不知道AREnvironmentProbeAnchor 是如何工作的。我假设 ARKit 为我创建了一系列具有纹理的 anchor ,但我看不到它们。 我在配置中添加了: sessi
ARKit 以 60 帧/秒的速度运行,相当于每帧 16.6 毫秒。 我当前将 CVPixelBufferRef(kCVPixelFormatType_420YpCbCr8BiPlanarFullRa
我在 ViewController.swift 中有一个 ARSCNView 并且我想将 ARFrames 保存到一个预先分配的数组中 func session(_ session: ARSessio
我是一名优秀的程序员,十分优秀!