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

Intel RealSense D435倾斜相机的目标相对高度计算问题

问题分析与解决方案

你的问题核心是像素转相机坐标系时的高度轴符号错误,导致旋转后的世界坐标系高度计算出现近高远低的偏差,同时需要确认旋转角度的方向是否匹配实际场景。

1. 修正像素到相机坐标系的高度计算

RealSense的像素坐标系默认以左上角为原点,y轴向下延伸。你定义z为高度轴(向上为正),但原始代码直接用(y - self.Cy) * coords.x * invFy计算z值,会出现符号颠倒的问题:

  • 当目标在图像中高于相机中心(y < Cy),y-Cy为负,计算出的z为负(实际应为正高度)
  • 当目标在图像中低于相机中心(y > Cy),计算出的z为正(实际应为负高度)

修正后的坐标转换代码:

def findPixelCoords(self, x: float, y: float, d: Image) -> Point:
        coords: Point = Point()

        invFx = 1/self.Fx
        invFy = 1/self.Fy

        coords.x = d[y][x] * 0.001  # 相机前向深度(原定义的x轴)
        coords.y = ((x - self.Cx) * coords.x * invFx) + 0.037  # 水平轴(原定义的y轴)
        # 修正高度轴符号:y像素向下为正,向上高度取负
        coords.z = -(y - self.Cy) * coords.x * invFy
        
        return coords

2. 确认旋转角度的方向与公式匹配

你使用的绕y轴旋转公式本身是正确的,但需要确保theta的正负与相机倾斜方向一致:

  • 若相机向下倾斜30°,theta = math.radians(30)
  • 若相机向上倾斜30°,theta = math.radians(-30)

修正后的旋转代码(结合修正后的坐标):

import math

theta = math.radians(30)  # 根据实际倾斜方向调整正负
cos_theta = math.cos(theta)
sin_theta = math.sin(theta)

# 原始相机坐标系坐标
oldX = coords.x
oldZ = coords.z

# 转换到世界坐标系
newX = oldX * cos_theta + oldZ * sin_theta
newZ = -oldX * sin_theta + oldZ * cos_theta

3. 问题根源解释

之前的newZ异常完全源于高度轴符号颠倒:

  • 近距离目标:原始z值符号错误,导致旋转时oldZ的贡献方向相反,计算出的newZ偏高
  • 远距离目标:原始z值的符号错误被-oldX*sin(theta)项放大,导致newZ偏低

修正后,旋转公式会正确映射相机坐标系下的高度到世界坐标系,同时保持不同距离下的实际高度差恒定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:53:11