You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TrueDepth的iOS设备间3D点测距结果不一致问题求助

前置TrueDepth相机跨设备测距精度问题

我正在利用iPhone和iPad Pro的前置TrueDepth相机,计算Vision识别并转换为屏幕坐标的两点间真实世界距离。目前已准确获取两点的深度值,不同设备间深度值高度相似,因此对Vision到屏幕坐标的转换及深度图索引访问的正确性有信心。但iPhone 12和当前款iPad Pro的测距结果不一致,且均不符合真实世界数值,仅一套替代计算方案在iPad上结果接近准确。

计算代码

let scaleFactor = Float(CGFloat(CVPixelBufferGetWidth(depthPixelBuffer)) / CGFloat(CVPixelBufferGetWidth(videoPixelBuffer)))
let cameraVideoImageSize = CGSize(width: CVPixelBufferGetWidth(videoPixelBuffer), height: CVPixelBufferGetHeight(videoPixelBuffer))
let depthImageSize = CGSize(width: CVPixelBufferGetWidth(depthPixelBuffer), height: CVPixelBufferGetHeight(depthPixelBuffer))

let fx = cameraIntrinsics.columns.0.x
let fy = cameraIntrinsics.columns.1.y
let cx = cameraIntrinsics.columns.2.x
let cy = cameraIntrinsics.columns.2.y

let uPoint1 = Float(convertedCGScreenPointDIP.x - CGFloat(cx))
let vPoint1 = Float(convertedCGScreenPointDIP.y - CGFloat(cy))

let uPoint2 = Float(convertedCGScreenPointWrist.x - CGFloat(cx))
let vPoint2 = Float(convertedCGScreenPointWrist.y - CGFloat(cy))

let xPoint1 = Float(uPoint1 * Float(distanceValue1) / Float(fx))
let yPoint1 = Float(vPoint1 * Float(distanceValue1) / Float(fy))

let xPoint2 = Float(uPoint2 * Float(distanceValue2) / Float(fx))
let yPoint2 = Float(vPoint2 * Float(distanceValue2) / Float(fy))

let newPoint1In3D = simd_float3(xPoint1, yPoint1, distanceValue1)
let newPoint2In3D = simd_float3(xPoint2, yPoint2, distanceValue2)

let newCalcDist = simd_precise_distance(newPoint1In3D, newPoint2In3D)

iPad Pro控制台输出

uPoint1 = -765.81476
vPoint1 = -9.825108
uPoint2 = -573.8772
vPoint2 = 25.938187
xPoint1 = -0.14148907
yPoint1 = -0.0018152503
xPoint2 = -0.10303553
yPoint2 = 0.0046570157
newPoint1In3D = SIMD3<Float>(-0.14148907, -0.0018152503, 0.3380777)
newPoint2In3D = SIMD3<Float>(-0.10303553, 0.0046570157, 0.32853785)
NEW DISTANCE CALCULATED =  0.04014441

iPhone 12控制台输出

uPoint1 = -1854.1045
vPoint1 = -647.44977
uPoint2 = -1735.0592
vPoint2 = -620.3905
xPoint1 = -0.20297308
yPoint1 = -0.07087782
xPoint2 = -0.1781995
yPoint2 = -0.06371729
newPoint1In3D = SIMD3<Float>(-0.20297308, -0.07087782, 0.30029702)
newPoint2In3D = SIMD3<Float>(-0.1781995, -0.06371729, 0.28173378)
NEW DISTANCE CALCULATED =  0.031774163

疑问与尝试

  • 猜测需结合intrinsicMatrixReferenceDimensions与OX/OY进行调整,但未找到明确方案
  • 尝试过深度图与相机视频分辨率的比例缩放,仅能缩放结果,无法解决跨设备精度问题

补充细节:使用的深度值来自深度图,单位为米。疑惑是否需要转换该值或其他像素值,以得到真实世界测量结果。

内容的提问来源于stack exchange,提问作者K_C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:31:16