Преобразование значений x/y из значений щелчка на экране в значения панорамирования/наклона ONVIF PTZ

В настоящее время мне поручено реализовать некоторые действия PTZ для камеры Onvif на C#. Моя камера имеет панорамирование на 360 градусов, наклон на 220 градусов, угол обзора 63 градуса по горизонтали и угол обзора 37 градусов по вертикали.

Прямо сейчас у меня есть видеопоток в WPF, который показывает все в FOV. Я хочу иметь возможность центрировать камеру в любом месте, которое я нажимаю. Я могу легко получить координаты x/y моего щелчка, но я не уверен, как их преобразовать.

API ONVIF принимает векторы панорамирования и наклона с X и Y между -1 и 1. Единственные данные, которые я могу собрать о канале камеры, это текущий вектор X и Y (между -1 и 1), центр видеопотока в X и Y (в пикселях), а также X и Y точки, которую я нажимаю.

Я перепробовал все вычисления, которые только мог придумать, чтобы получить вектор для относительного или абсолютного движения. Я использовал комментарий из этот пост для вычисления дельты градусов на основе дельты пикселей, но результат даже не кажется близким. Я использовал формулы в этот пост для получить значение панорамирования и наклона, но я не совсем уверен, как использовать результаты полезным образом.

Я попытался получить процент расстояния и применить его к текущему вектору положения, но это также не сработало.

Я предполагаю, что мой лучший выбор - найти относительное движение, поскольку поиск абсолютного вектора только с FOV кажется трудным. Если у кого-нибудь есть понимание того, как я могу рассчитать его без особых проблем, это будет очень признательно.


person jschioppo    schedule 13.02.2020    source источник


Ответы (1)


Я решил это, и решение было намного проще, чем то, чего я пытался достичь. Ответ был не в какой-то сложной формуле, а в понимании спецификации Onvif. Для тех, у кого есть подобные проблемы, я объясню, что я сделал.

Onvif имеет несколько разных пробелов для абсолютного и относительного перевода, по умолчанию это [-1, 1] для x и y. Однако вы можете предоставить другое место для переводов. Вы можете увидеть разрешенные пробелы в объекте, возвращаемом из GetConfigurationOptions, который принимает токен конфигурации. Вы можете получить все токены конфигурации с помощью GetConfigurations и выбрать один из этих токенов, если не знаете, как его получить.

Оттуда выберите подходящий масштаб и наблюдайте за максимальным и минимальным значениями для X и Y. В моем случае проще всего было использовать пространство, которое позволяло мне выполнять относительные перемещения в пределах поля зрения. Оттуда вам просто нужно тщательно рассчитать дельту между центром и вашим кликом, используя любой метод, который вы хотите, и создать некоторое значение между [-1, 1]. Спецификации службы ONVIF содержат гораздо больше информации об этом.

person jschioppo    schedule 21.02.2020