Преобразование значений x / y из щелчка на экране в значения поворота / наклона ONVIF PTZ - PullRequest
0 голосов
/ 13 февраля 2020

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

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

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

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

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

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

1 Ответ

0 голосов
/ 22 февраля 2020

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

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

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

...