如何以编程方式告诉相机指向何处?


8

我现在没有特定的摄像头,我很好奇它是如何以编程方式/数学方式完成的。

我有一个3D空间,一个矩形,一个摄像头朝上,向内看向内。
我在那个矩形中有一个移动的对象,该对象正在传输其当前位置的(x,y,z)坐标。
我想获取这些坐标并将其转换为指示相机指向该位置的指令。
此翻译通常如何完成?


您可能需要研究游戏开发人员如何处理游戏中的相机。这是相同的原理,可以说,他们必须处理太阳下的所有事物。
哈拉贝克

可能值得注意的是,对象不必在真实的3D空间中传输其坐标,而是可以通过位于相机的FOV中进行传输。然后,您将使用模式识别来找到对象在帧中的位置,然后移动相机以使对象居中(或通过跟踪多个帧中位置的变化并沿该方向移动来识别2D运动矢量) 。例如,我在门廊上的PTZ摄像机扫描门廊,以查找不是由于平移运动引起的运动,然后锁定并跟随移动的项目,直到运动停止为止。
dannysauer '18

我的用例是一个运动分析系统,每个球员都戴着一个标签,该标签可以在球场上传输当前位置,速度等信息。所以我们已经有了位置信息。我肯定会看看模式识别。听起来很有用。
bot_bot

Answers:


10

三角学!

我的相机是DLink 5020-L,并具有可以通过API给出的水平/倾斜命令。它还具有可设置的预定义位置,也可以通过API触发

预初始化

  • 在参考中将摄像机的位置定义为0°摇摄和0°倾斜=>我们将其称为该位置 Position 1

在里面

  • 将相机移至 Position 1
  • 通过0初始化变量或通过API将相机的云台存储在某处

看物体

  • 在两个平面(X,Y和Y,Z平面)中找到您的对象
  • 然后您可以获取平移(左/右)角(IoT SE中的omg数学公式!)

$$ \ arctan \ bigg(\ frac {y} {x} \ bigg)$$

  • 然后可以得到倾斜角度(上/下)

$$ \ arctan \ bigg(\ frac {z} {y} \ bigg)$$

  • 不要忘了保存/更新新的水平/俯仰值,因为您可能需要相对移动...

您可能会否定先前的结果,具体取决于相机的放置方式

(我将在有空的时候添加一些原理图)


2
被@hardillb殴打;)他的配方看起来更好...
Goufalite

2
不幸的是,LaTeX支持在此站点上不可用。您也可以从CodeCogs之类的位置将其导出到图像中(如果愿意)作为替代。(我已经为您完成了此操作;您可以根据需要进行编辑,或者如果您不想要的话,可以将其删除!)
Aurora0001

谢谢你们的帮助。这正是我想要的。
bot_bot

我认为您忘记考虑了这样一个事实,即倾斜角的反正切必须相对于斜边的z分量:将其放在y分量上可能会导致摄像机升/降得不够,因为摄像机将要沿y分量和x分量之间直角三角形的斜边而不是y轴指向。如我错了请纠正我。:)很好的答案,虽然。
匿名2

@ anonymous2也是我的想法。我认为目前提出的答案还不正确,但我现在还没有足够的带宽来实际表明这一点-似乎您需要两个三角形和所有三个坐标才能获得可变值(平移或倾斜)。您可以通过可视化两个不同的极端示例来自己证明这一点:1,1,999的x,y,z与1,1,1相比将产生很大不同的平移和倾斜。古法利特的答案为这两者提供了相同的底盘。
dwizum

6

已经有了不错的答案,我只想补充一些您应该考虑的其他事项。就像hardlib和Goufalite已经提到的那样,做到这一点的方法是三角的。我绘制了摄像机和IoT对象的二维图:

在此处输入图片说明

如您所见,当物体移远时,相机的视野将大于该物体-如果不在近距离内。

现在,您可能希望照相机始终位于对象的中心。在这种情况下,您可以简单地进行hardlib引用的计算:

ϴ = arctan(y/x)

...根据惯例,它是与x轴逆时针的角度。您还需要远离水平面的角度:

α = arctan(z / ((y^2+x^2)^1/2))

显然,您必须基于所有三个轴的原点来计算摄像机位置。

另一方面,您可能更希望不要使摄像机移动超过必要的程度,也就是说,仅当对象似乎要移出框架时才使摄像机移动。在这种情况下,您可能需要一个“压力”变量,该变量将使摄像机更有可能根据对象与框架边缘的接近程度来更改其角度。

如果沿着该路线行驶,则需要在两个视场中都知道相机视场的角度,以便可以确定将对象与相机视场进行比较的位置。


这很棒!谢谢,此刻,我要保持对象在相机视场中居中。
bot_bot

2
平移/倾斜摄像机时,每个命令之间会有一定的延迟(
〜0.5

好点-绝对是要考虑的事情。
匿名2

5

通常使用基本三角函数完成此操作。

首先在单个2d平面上进行工作,其中相机位于原点(0,0),对象位于(x,y)

假设x距离将是三角形的相邻边,而y距离将是相反的:

tan(角度)= y / x

这样可以找到

角度= invTan(y / x)

您还可以使用以下方法计算出相机和物体之间的直线距离(斜边):

h ^ 2 = x ^ 2 + y ^ 2

给予:

h = sqrt(x ^ 2 + y ^ 2)

现在,您可以使用与z高度相同的h距离来计算倾斜角度。

一旦有了角度,就可以将这些角度输入到控制相机上的云台的角度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.