我有一台可以进行云台控制的IP摄像机。当前,我正在将实时视频流传输到浏览器中,并希望允许用户单击屏幕上的某个点,使摄像机能够水平和垂直移动以使用户点击的位置成为视野的中心点。
我的摄像机可以水平旋转360度,垂直旋转范围为-55到90度。
有什么算法可以指导我实现这个目标吗?
我有一台可以进行云台控制的IP摄像机。当前,我正在将实时视频流传输到浏览器中,并希望允许用户单击屏幕上的某个点,使摄像机能够水平和垂直移动以使用户点击的位置成为视野的中心点。
我的摄像机可以水平旋转360度,垂直旋转范围为-55到90度。
有什么算法可以指导我实现这个目标吗?
让我们从围绕摄像机(原点)声明一个三维坐标系开始。我将使用以下方式:z轴向上,x轴是相机方向,其中pan=tilt=0
,正面朝向的pan角度会将相机移动到正y轴方向。
然后,对于给定的pan / tilt配置,变换为:
T = Ry(-tilt) * Rz(pan)
+-tan(fovx/2)
,垂直范围是+-tan(fovy/2)
。(x, y)
在这个图像中(原点在左上角),我们首先需要把这个位置转换成一个三维方向。我们从计算图像平面上的局部坐标开始。对于图像的像素宽度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)
假设还没有平移或倾斜,这是包含相应像素的光线。但现在是时候摆脱这种假设了。这就是我们最初的转换发挥作用的地方。我们只需要转换这条射线:
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
现在得到的方向描述了包含我们在开始时设置的全局坐标系中指定像素的射线。现在只需要计算新的平移/倾斜参数:
tilt = atan2(tz, tx)
pan = asin(ty / sqrt(tx^2 + ty^2 + tz^2))