通过 3 个图像点 (1D) 获取相机 2d 位置
Get Camera 2d position by 3 image points (1D)
我有一张图像和 3 个点,每个点的数据如下:
- x 和 y 二维世界坐标
- x 图像坐标
如何计算相机方向(仅 left/right)和 2d 世界位置?
谢谢。
编辑:图像是普通摄影(所以是透视投影)。世界坐标是一张地图的俯视图,所以正射投影)。
给定世界中的一个点 space,投影可以表示为
(x - cx) * cos(phi) - (y - cy) * sin(phi)
proj(x, y) = -----------------------------------------
(x - cx) * sin(phi) + (y - cy) * cos(phi)
cx
和 cy
是相机位置,phi
是相机旋转。投影将产生相机坐标(而非图像坐标)中的值。要将图像坐标转换为相机坐标,usw
cameraX(imageX) = (2 * imageX / W - 1) * tan(fovy / 2) * ratio
W
是图像的像素宽度,fovy
是垂直视野,ratio
是图像的纵横比。
那你要解给定的三个点所组成的方程组。有一个解析解,但它很复杂。所以你只剩下数值(可能是最小二乘)求解器。选择一个,插入公式并得到你的结果。由于您同时针对位置和角度进行了优化,因此您可能希望对值进行归一化,以便它们具有相似的范围。如果您不确定要使用什么优化器,我用 levmar 得到了很好的结果来解决类似的问题。
这一切都假设相机不会扭曲图像。
我有一张图像和 3 个点,每个点的数据如下:
- x 和 y 二维世界坐标
- x 图像坐标
如何计算相机方向(仅 left/right)和 2d 世界位置?
谢谢。
编辑:图像是普通摄影(所以是透视投影)。世界坐标是一张地图的俯视图,所以正射投影)。
给定世界中的一个点 space,投影可以表示为
(x - cx) * cos(phi) - (y - cy) * sin(phi)
proj(x, y) = -----------------------------------------
(x - cx) * sin(phi) + (y - cy) * cos(phi)
cx
和 cy
是相机位置,phi
是相机旋转。投影将产生相机坐标(而非图像坐标)中的值。要将图像坐标转换为相机坐标,usw
cameraX(imageX) = (2 * imageX / W - 1) * tan(fovy / 2) * ratio
W
是图像的像素宽度,fovy
是垂直视野,ratio
是图像的纵横比。
那你要解给定的三个点所组成的方程组。有一个解析解,但它很复杂。所以你只剩下数值(可能是最小二乘)求解器。选择一个,插入公式并得到你的结果。由于您同时针对位置和角度进行了优化,因此您可能希望对值进行归一化,以便它们具有相似的范围。如果您不确定要使用什么优化器,我用 levmar 得到了很好的结果来解决类似的问题。
这一切都假设相机不会扭曲图像。