【问题标题】:Why does the projection of an image over 3d points show this distortion?为什么图像在 3d 点上的投影会显示这种失真?
【发布时间】:2015-08-31 12:22:46
【问题描述】:

我有一个关于在一组 3D 点上投影图像的问题。该图像以 JPG 格式提供给我,以及相机相对于笛卡尔坐标系(Xc、Yc、Zc 和偏航、俯仰、滚动)的位置和姿态信息,以及水平和垂直视野(度数)。

仅使用它们在同一坐标系 (Xp,Yp,Zp) 中的 3d 位置给出点。

在我的坐标系中,Z 向上。要将图像投影到点上,我

  • 计算从相机到每个点的向量

    Vector3 c2p = (Xp,Yp,Zp)-(Xc,Yc,Zc);
    
  • 根据我相机的姿态(四元数)旋转 c2p:

    Vector3 c2pCamFrame = getCamQuaternion().conjugate().rotate(c2p);
    
  • 计算从相机的“中心射线”到该点的方位角和仰角:

    float azimuth = atan2(c2pCamFrame.x(),c2pCamFrame.y()));
    float elevation = atan2(c2pCamFrame.z(),sqrt(pow(c2pCamFrame.x(),2)+pow(c2pCamFrame.y(),2)));
    
  • 如果方位角和仰角在视野范围内,我将相应像素的颜色分配给该点。

这几乎完美无缺,“几乎”激发了我的问题。让我演示给你看:

我无法弄清楚为什么投影的高度会失真。在图像的右下角,您可以看到平截头体之外的点(超过仰角)实际上变成了彩色 - 这种失真在 0 度的方位角处为零,并且在图像的左右边缘处达到峰值,从而创建枕头变形。

为什么会出现这种失真?我很想用几何和数学术语来理解这个问题。谢谢!

【问题讨论】:

  • 看起来像精度问题您使用浮点数吗? 32/64/80/128 位?点和相机的坐标值是多少 视锥体的 FOV 是多少(角度、znear、zfar)。您将每个点的许多测角函数堆叠在一起可能更好的是构造单个变换矩阵(以高精度计算)并将其用于所有点,如果您的位置动态范围很高,那么它可能会导致失真。建议使用至少 64 位浮点类型和尽可能精确的测角函数(尤其是对于 atan2)
  • @Spektre,我不认为这是一个精确的问题。是的,我在所有地方都使用 32 位浮点数,但是对于示例中显示的所有点,c2p 的长度小于 200。Fov 度数是 45h 和 30v。我究竟会在哪里失去如此多的精度,以至于我的高度偏离了这么多?
  • c2p 是相对值 全球的绝对值是多少?如果您要减去 1000000000200.0-1000000000000.0=200.0 之类的内容,那么这是精确的事情,如果不是,那么问题可能出在其他地方。由于您没有提供示例案例数据,我们只能猜测。嵌套太多的测角函数也会对此产生负面影响......另一件事是你是如何渲染这些图像的(使用另一个投影?)问题可能也存在......

标签: graphics 3d computational-geometry projection


【解决方案1】:

视场角仅在主轴上有效。但是你可以反过来做。 IE。从角度计算 x/y 边界:

maxX = tan(horizontal_fov / 2)
maxY = tan(vertical_fov / 2)

然后检查

if(abs(c2pCamFrame.x() / c2pCamFrame.z()) <= maxX
     && abs(c2pCamFrame.y() / c2pCamFrame.z()) <= maxY)

此外,您可能需要检查点是否在相机前面:

     ... && c2pCamFrame.z() > 0

这假定一个左手坐标系。

【讨论】:

  • 我尝试了这种方法,它似乎有效。但是,我想知道它是否准确。我现在确定与主轴的最大偏差(maxX/maxY),然后与实际偏差进行比较以计算图像的像素坐标。我这样做是否没有有效地线性化非线性问题?改写:这是否也适用于广角 FoV(假设没有镜头失真)?
  • 这里没有近似值,除了浮点不精确。上述解释适用于投影到平面上的所有模型(您的问题似乎就是这种情况)。平面上的投影是完全线性的。您的方法假设了一个球体上的投影,这确实是非线性的。
  • 我确实将图像投影到空间中不完全平面的点上。事实上,在上图中,您可以看到这些点近似于一个略微波浪状的地面,然后,我还想将图像投影到圆柱体和其他几何体上。究竟是什么限制了这种仅在平面上投影图像的方法?还是您只是说首先捕获图像的图像传感器必须是平面的?
  • 对于其他基元(平面除外),您当然需要其他公式。但是只要你投影一个平面矩形图像,上面的公式就可以了。点的分布方式无关紧要(无论它们是形成波浪形地面还是圆柱体)。
猜你喜欢
  • 2023-03-03
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2012-03-30
相关资源
最近更新 更多