将 x/y 值从屏幕点击转换为 ONVIF PTZ pan/tilt 值

Converting x/y values from on screen click to ONVIF PTZ pan/tilt values

我目前的任务是用 C# 为 Onvif 摄像机实现一些 PTZ 操作。我的相机有 360 度平移、220 度倾斜、63 度水平 FOV 和 37 度垂直 FOV。

现在,我在 WPF 中有一个视频源,它显示了 FOV 内的所有内容。我希望能够将相机置于我单击的任何位置的中心。我可以轻松获得点击的 x/y 坐标,但我不确定如何进行有意义的转换。

ONVIF API 接受 X 和 Y 介于 -1 和 1 之间的平移和倾斜矢量。我可以收集的关于相机馈送的唯一数据是它的当前 X 和 Y 向量(介于 -1 和 1 之间) )、X 和 Y(像素)中视频源的中心,以及我单击的点的 X 和 Y。

我已经尝试了所有我能想到的计算来获得相对移动或绝对移动的向量。我使用 this post to calculate the degree delta based on the pixel delta, but the result doesn't even seem close. I used the formulas in this post 的评论来获得平移和倾斜值,但我不太确定如何以有用的方式使用结果。

我试过获取距离百分比并将其应用于当前位置向量,但也没有用。

我猜我最好的选择是找到相对移动,因为找到仅具有 FOV 的绝对向量似乎很困难。如果有人对我如何轻松计算它有任何见解,将不胜感激。

我解决了这个问题,这个解决方案比我想要实现的要简单得多。答案不是一些复杂的公式,而是了解 Onvif 规范。对于任何有类似问题的人,我会解释我做了什么。

Onvif 有几个不同的 spaces 用于绝对和相对翻译,默认为 [-1, 1] for x 和 y。但是,您可以为翻译提供不同的 space。您可以在从 GetConfigurationOptions 返回的对象中看到允许的 spaces,它采用配置令牌。您可以使用 GetConfigurations 获取所有配置令牌,如果您不确定如何获取,则可以选择其中一个令牌。

从那里选择适合的比例并观察 X 和 Y 的最大值和最小值。在我的例子中,最简单的方法是使用 space 让我在 FOV 内进行相对平移。从那里您只需要使用您喜欢的任何方法仔细计算中心和点击之间的增量,并在 [-1, 1] 之间创建一些值。 ONVIF 服务规范对此有更多信息。