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

Math 将屏幕坐标[x,y]转换为摄像机的平移和倾斜角度,math,camera,trigonometry,Math,Camera,Trigonometry,我有一个IP摄像机,可以PTZ。我目前正在将实时视频流传送到浏览器中,希望允许用户单击屏幕上的一个点,相机将平移和倾斜,以便用户单击的位置现在成为中心视点 我的相机可以360度平移,从-55倾斜到90度 任何能指导我实现目标的算法???让我们先声明摄像机周围的三维坐标系(原点)。我将使用以下命令:z轴指向上方。x轴是相机的方向,平移=倾斜=0,正平移角度将使相机朝正y轴移动 然后,给定摇摄/倾斜配置的变换为: T = Ry(-tilt) * Rz(pan) 这是在3D空间中定位虚拟图像平面的变

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

我的相机可以360度平移,从-55倾斜到90度


任何能指导我实现目标的算法???

让我们先声明摄像机周围的三维坐标系(原点)。我将使用以下命令:z轴指向上方。x轴是相机的方向,平移=倾斜=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))

获取/测量您相机的FOV,然后通过线性插值将像素位置转换为角度,也就是说,您的实际位置是中心像素,因此在x和y方向与中心的距离将直接获得移动角度。我有65度的相机FOV。。这不是线性插值。。当相机直视而不倾斜时,可以线性插值,但当存在倾斜时,该值不是线性的。。更像是一个球形的半球,除非你有一些奇怪的防鱼眼镜头或滤镜,否则它是线性的。您描述的问题更像是错误的转换顺序。摄像机FOV有两个角度,即水平和垂直。另外,相机的运动学是什么?如果旋转中心不相同,且在焦点中,则需要应用几何体校正,但为此,需要共享几何体。。。