我有一台可以进行PTZ的IP摄像机。我目前正在将实时数据流传输到浏览器中,并希望允许用户单击屏幕上的某个点,并且相机将平移并倾斜,以便用户单击位置现在成为中心观点。翻译屏幕坐标[x,y]到相机平移和倾斜角度
我的相机水平360度和垂直-55°〜90°
,将引导我实现我的目标的任何算法?
我有一台可以进行PTZ的IP摄像机。我目前正在将实时数据流传输到浏览器中,并希望允许用户单击屏幕上的某个点,并且相机将平移并倾斜,以便用户单击位置现在成为中心观点。翻译屏幕坐标[x,y]到相机平移和倾斜角度
我的相机水平360度和垂直-55°〜90°
,将引导我实现我的目标的任何算法?
我们首先声明相机周围的三维坐标系(原点)。我将使用以下内容:z轴向上指向。 x轴是与pan=tilt=0
相关的方向,并且正的平移角度会将摄像机移向正y轴。
然后,变换为给定的摇摄/倾斜的配置是:
T = Ry(-tilt) * Rz(pan)
这是变换定位我们的虚像平面在三维空间中。让我们记住这一点,并转到图像平面。
如果我们知道垂直和水平视场并假定镜头失真已经被校正,我们可以按如下方式设置我们的成像平面:成像平面距离相机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))
获得/测量FOV你的相机,然后通过线性插值转换像素位置的角度,这是它的实际位置是中心像素所以从中心的距离x和y会直接得到你的运动角度 – Spektre
我有相机的65度视角..它不是一个线性插值..当相机看起来直线没有倾斜它可以线性内插,但是当有倾斜该值不是线性的。更像是相机是球形的圆顶 – Balakrishnan
除非你有一些奇怪的反鱼眼镜头或过滤器,那么它是线性的。您所描述的问题看起来更像是错误的转换顺序。相机FOV有2个角度btw水平和垂直。如果旋转中心不同并且在焦点上,那么相机的运动学是什么,那么您需要应用几何校正,但为此您需要共享几何... – Spektre