为什么图像在 3d 点上的投影会显示这种失真?
Why does the projection of an image over 3d points show this distortion?
我对图像在一组 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);
计算从相机 "center ray" 到点的方位角和仰角:
float azimuth = atan2(c2pCamFrame.x(),c2pCamFrame.y()));
float elevation = atan2(c2pCamFrame.z(),sqrt(pow(c2pCamFrame.x(),2)+pow(c2pCamFrame.y(),2)));
如果方位角和仰角都在视野内,我就把对应像素点的颜色赋值给这个点。
这几乎完美,"almost" 激发了我的问题。让我演示给你看:
我不明白为什么投影的高程失真了。在图像的右下角,您可以看到平截头体之外的点(超过高程)实际上变成了彩色 - 这种失真在 0 度方位角处为零,并在图像的左右边缘达到峰值,从而创建枕头变形。
为什么会出现这种失真?我很想用几何和数学术语来理解这个问题。谢谢!
视野角度仅在主轴上有效。但是你可以反过来做。 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
这假设是左手坐标系。
我对图像在一组 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);
计算从相机 "center ray" 到点的方位角和仰角:
float azimuth = atan2(c2pCamFrame.x(),c2pCamFrame.y())); float elevation = atan2(c2pCamFrame.z(),sqrt(pow(c2pCamFrame.x(),2)+pow(c2pCamFrame.y(),2)));
如果方位角和仰角都在视野内,我就把对应像素点的颜色赋值给这个点。
这几乎完美,"almost" 激发了我的问题。让我演示给你看:
我不明白为什么投影的高程失真了。在图像的右下角,您可以看到平截头体之外的点(超过高程)实际上变成了彩色 - 这种失真在 0 度方位角处为零,并在图像的左右边缘达到峰值,从而创建枕头变形。
为什么会出现这种失真?我很想用几何和数学术语来理解这个问题。谢谢!
视野角度仅在主轴上有效。但是你可以反过来做。 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
这假设是左手坐标系。