基于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
相关产品推荐
相关产品推荐

