将屏幕坐标[ x,y ]转换为相机的俯仰和偏航角

6

我有一台可以进行云台控制的IP摄像机。当前,我正在将实时视频流传输到浏览器中,并希望允许用户单击屏幕上的某个点,使摄像机能够水平和垂直移动以使用户点击的位置成为视野的中心点。

我的摄像机可以水平旋转360度,垂直旋转范围为-55到90度。

有什么算法可以指导我实现这个目标吗?


获取/测量您相机的视场角,然后通过线性插值将像素位置转换为角度,这就是您的实际位置。中心像素是您的实际位置,因此从x和y的中心距离将直接得到移动角度。 - Spektre
我有相机的视野,为65度。它不是线性插值。当相机没有倾斜时,可以进行线性插值,但当存在倾斜时,该值不是线性的。更像相机是一个球形圆顶。 - Balakrishnan
除非你使用了一些奇怪的防鱼眼镜头或滤镜,否则它是线性的。你所描述的问题更像是变换顺序错误。相机视场角有水平和垂直两个角度。此外,如果旋转中心不同且不在焦点上,则需要应用几何校正,但为此你需要共享几何信息... - Spektre
1个回答

3

让我们从围绕摄像机(原点)声明一个三维坐标系开始。我将使用以下方式:z轴向上,x轴是相机方向,其中pan=tilt=0,正面朝向的pan角度会将相机移动到正y轴方向。

然后,对于给定的pan / tilt配置,变换为:

T = Ry(-tilt) * Rz(pan)

这里的变换用来将虚拟图像平面定位于三维空间中。记得这一点,然后转到图像平面。
如果我们知道垂直和水平视场并假设镜头畸变已经被校正,我们可以设置我们的图像平面如下:图像平面距离相机1个单位(只是声明),在视线方向上。让中心点成为平面的本地原点。那么,它的水平范围是+-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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接