2017-05-30 47 views
0

我有一台可以进行PTZ的IP摄像机。我目前正在将实时数据流传输到浏览器中,并希望允许用户单击屏幕上的某个点,并且相机将平移并倾斜,以便用户单击位置现在成为中心观点。翻译屏幕坐标[x,y]到相机平移和倾斜角度

我的相机水平360度和垂直-55°〜90°

,将引导我实现我的目标的任何算法?

+0

获得/测量FOV你的相机,然后通过线性插值转换像素位置的角度,这是它的实际位置是中心像素所以从中心的距离x和y会直接得到你的运动角度 – Spektre

+0

我有相机的65度视角..它不是一个线性插值..当相机看起来直线没有倾斜它可以线性内插,但是当有倾斜该值不是线性的。更像是相机是球形的圆顶 – Balakrishnan

+0

除非你有一些奇怪的反鱼眼镜头或过滤器,那么它是线性的。您所描述的问题看起来更像是错误的转换顺序。相机FOV有2个角度btw水平和垂直。如果旋转中心不同并且在焦点上,那么相机的运动学是什么,那么您需要应用几何校正,但为此您需要共享几何... – Spektre

回答

0

我们首先声明相机周围的三维坐标系(原点)。我将使用以下内容: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))