我有一台可以PTZ的IP摄像头。我目前正在将实时馈送流式传输到浏览器中,并希望允许用户点击屏幕上的某个点,摄像机将平移和倾斜,以便用户点击的位置现在将成为中心视点。
我的相机平移360度,从-55到90倾斜。
任何可以指导我实现目标的算法?
答案 0 :(得分:0)
让我们首先在相机周围声明一个3D坐标系(原点)。我将使用以下内容:z轴向上指向。 x轴是具有pan=tilt=0
的摄像机方向,正平移角将使摄像机朝向正y轴移动。
然后,给定摇摄/倾斜配置的变换是:
T = Ry(-tilt) * Rz(pan)
这是将我们的虚拟图像平面定位在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)
这是在假设没有平移或倾斜的情况下包含相应像素的光线。但是现在是时候摆脱这个假设了。这就是我们最初的转变发挥作用的地方。我们只需要改变这条光线:
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))