将屏幕坐标 [ x, y ] 转换为相机平移和倾斜角度

Bal*_*nan 6 math camera trigonometry

我有一个可以 PTZ 的网络摄像机。我目前正在将实时流传输到浏览器中,并希望允许用户单击屏幕上的一个点,相机将平移和倾斜,以便用户单击的位置现在将成为中心视点。

我的相机平移 360 度,倾斜范围为 -55 到 90。

有什么算法可以指导我实现我的目标吗?

Nic*_*ler 3

我们首先声明相机周围的 3D 坐标系(原点)。我将使用以下内容: z 轴指向上方。x 轴是摄像机方向,pan=tilt=0正平移角度会将摄像机朝正 y 轴移动。

然后,给定平移/倾斜配置的变换为:

T = Ry(-tilt) * Rz(pan)
Run Code Online (Sandbox Code Playgroud)

这是将我们的虚拟图像平面定位在 3D 空间中的变换。让我们记住这一点并进入图像平面。

如果我们知道垂直和水平视场并假设镜头畸变已得到校正,则可以按如下方式设置图像平面:图像平面在视图方向上距相机 1 个单位(仅声明)。令中心为平面的本地原点。那么,它的水平范围是+- tan(fovx / 2),垂直范围是+- tan(fovy / 2)

现在,给定该图像中的像素位置(x, y)(原点位于左上角),我们首先需要将该位置转换为 3D 方向。我们首先计算图像平面中的局部坐标。这是图像的像素宽度w和像素高度h

lx = (2 * x / w - 1) * tan(fovx / 2)
ly = (-2 * y / h + 1) * tan(fovy / 2)   (local y-axis points upwards)
lz = 1                                  (image plane is 1 unit away)
Run Code Online (Sandbox Code Playgroud)

这是在假设还没有平移或倾斜的情况下包含相应像素的光线。但现在是时候摆脱这个假设了。这就是我们最初的转变发挥作用的地方。我们只需要变换这条光线:

tx = cos(pan) * cos(tilt) * lx - cos(tilt) * sin(pan) * ly - sin(tilt) * lz
ty = sin(pan)             * lx + cos(pan)             * ly
tz = cos(pan) * sin(tilt) * lx - sin(pan) * sin(tilt) * ly + cos(tilt) * lz
Run Code Online (Sandbox Code Playgroud)

现在得到的方向描述了包含我们在开始时设置的全局坐标系中指定像素的光线。剩下的就是计算新的平移/倾斜参数:

tilt = atan2(tz, tx)
pan  = asin(ty / sqrt(tx^2 + ty^2 + tz^2))
Run Code Online (Sandbox Code Playgroud)