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

物联网 跟踪设备 监视摄像头
2021-06-28 02:02:41

我现在没有想到特定的相机,我只是好奇这是如何以编程/数学方式完成的。

我有一个 3D 空间,一个矩形,一个角落里有一个向内看的相机。
我在那个矩形中有一个移动对象,它正在传输其当前位置的 (x, y, z) 坐标。
我想获取这些坐标并将它们转换成指令,告诉相机指向那个位置。
这种翻译通常是如何完成的?

3个回答

三角学!

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

预初始化

  • 在您的参考文件中将相机的位置定义为 0° 平移和 0° 倾斜 => 我们将称之为该位置 Position 1

在里面

  • 将您的相机移至 Position 1
  • 将相机的平移/倾斜存储在某个位置,可以在 0 初始化变量中或通过您的 API

看对象

  • 在两个平面中定位您的对象,X,Y 和 Y,Z 平面
  • 然后您可以获得平移(左/右)角度(物联网 SE 中的数学公式!)

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

  • 然后你可以获得倾斜(向上/向下)角度

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

  • 不要忘记保存/更新新的平移/倾斜值,因为您可能会处理相对运动...

根据相机的放置方式,您可能会否定之前的结果

(有时间我会加一些原理图)

已经有了很好的答案,我只想添加一些您应该考虑的其他事项。就像 hardlib 和 Goufalite 已经提到的那样,这样做的方法是三角函数。我已经绘制了相机和 IoT 对象的二维描述:

在此处输入图片说明

正如您所看到的,相机的视野将比物体大——如果不是近距离,当物体移得更远时。

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

ϴ = arctan(y/x)

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

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

显然,您必须根据位于所有三个轴上的原点的相机位置进行计算。

另一方面,您可能更喜欢不要让相机移动到不必要的位置,也就是说,让相机只在物体看起来要移出框架时才移动。在这种情况下,您可能需要一个“压力”变量,这将使相机更有可能根据对象与帧边缘的接近程度来改变其角度。

如果你走那条路,你需要知道相机在两个视野中的视野角度,这样你就可以确定物体与相机视野的比较位置。

这通常是用基本的三角学来完成的

首先在单个 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)

现在您可以使用 h 距离和 z 高度以相同的方式计算倾斜角。

一旦你有了角度,你就可以将这些提供给控制相机上的平移/倾斜的东西。