我想计算具有给定高度的相机到像素位置(在世界坐标中)的光线方向,如this paper中所述。相机图像尺寸为640,480。我校准了固有的相机参数并且不对每个图像进行分类。我在这里描绘了相机和背景平面(29厘米)之间的物理距离:
1 cm转换为25像素(假设为二次像素)。我的第一种方法是根据像素和相机位置计算如下:
float3 pixPos = (float3)(u, v, z);
float3 camPos = (float3)(height/2, width/2, 29*25);
float3 ray = normalize(pixPos-camPos);
其中u,v是从0,0到高度的图像坐标,宽度和z是我(已经估计的)高度值。这似乎不是正确的方法。我已经对SO进行了搜索并找到this answer,但其中描述的解决方案不包括像素高度(此处为z)。
答案 0 :(得分:13)
首先,您需要定义相机的坐标系。它是正交坐标系,这意味着所有三个基矢量彼此垂直并且具有相同的大小(不必是“一”)。如果您的相机坐标系是right-handed or left-handed(我将谈论左撇子),你还需要指出。首先,您需要定义up vector
(向量显示屏幕上y轴是什么)和camera direction vector
(因此从眼睛位置到投影平面中间的向量)。然后,您将left vector
和cross product
的{{1}}计算up vector
(或右侧向量,如果需要)(它指向屏幕上x轴的确切位置)。现在,因为只有相机方向矢量和左矢量是垂直的,所以你必须camera direction vector
one more cross product
和camera direction vector
(图像上的矢量y)。
所以你会得到像这样的相机协调系统
不,您必须定义,您的投影屏幕在世界坐标中有多大。这可能有时很棘手,因此您也可以通过两个角度(left vector
和phi
)以及与眼睛位置的距离(让我们称之为theta
)来定义它。
您将获得和。 (d
向量是在屏幕上定义x轴的向量,因此它是x
或右向量,取决于手性)
通过这两个向量left vector
和u
的线性组合,您可以计算投影屏幕上的任何位置。系数 v
和虽然表示距投影屏幕中间的距离alpha
。
所以和,the point
和s
r
和x
坐标在您计算的图像上{{1} }和y
是合适的尺寸。
正如你在这张图片上看到的那样
投影平面上任意点的最终位置为。
然后,请求的向量计算为。