Як я можу програмно сказати камері, куди слід вказати?


8

Зараз у мене немає конкретної камери на увазі, мені просто цікаво, як це робиться, програмно / математично.

У мене тривимірний простір, прямокутник, з камерою вгорі в одному куті і дивиться всередину.
Я маю рухомий об’єкт у тому прямокутнику, який передає (x, y, z) координати його поточного положення.
Я хочу взяти ці координати і перевести їх в інструкції, які кажуть камері вказувати на це положення.
Як зазвичай робиться цей переклад?


Ви можете поглянути, як розробники ігор обробляють свої ігрові камери. Це той самий принцип, і їм довелося, так би мовити, боротися з усім під сонцем.
Харабек

Можливо, варто відзначити, що об’єкт не повинен передавати свої координати в буквальному 3D-просторі, а, скоріше, може передавати, перебуваючи у FOV камери. Потім ви використовуєте розпізнавання шаблонів, щоб знайти місце в кадрі, а потім перемістити камеру в центр об'єкта (або іншим чином визначити вектор руху в 2D, відстежуючи зміну положення в декількох кадрах і рухаючись у цьому напрямку) . Наприклад, моя камера PTZ на ганку сканує ганок, шукаючи рух не за рахунок руху панорамування, а потім фіксує та слідкує за рухомим елементом, поки рух не припиниться.
dannysauer

Мій випадок використання - система спортивної аналітики, кожен гравець носить бирку, яка передає поточну позицію, швидкість тощо на полі. Тож у нас вже є інформація про посаду. Я обов'язково огляну розпізнавання візерунка. Звучить корисно.
bot_bot

Відповіді:


10

Тригонометрія!

Моя камера є DLink 5020-L і має команди панорамування / нахилу, які можна задавати через API . Він також має заздалегідь задані позиції, які також можна запускати через API

Попередньо init

  • Визначте положення вашої камери на панорам 0 ° та нахилі 0 ° у вашому референтному => ми будемо називати це положення Position 1

У цьому

  • Перемістіть камеру до Position 1
  • Зберігайте десь панорамування / нахил вашої камери, або в 0-ініціалізованих змінних, або через API

Подивіться на об’єкт

  • Розташуйте об'єкт у двох площинах, площинах X, Y і Y, Z
  • Тоді ви можете отримати кут розміщення (лівий / правий) кут (omg математичні формули в IoT SE!)

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

  • Ви можете отримати кут нахилу (вгору / вниз)

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

  • Не забудьте зберегти / оновити нове значення панорамування / нахилу, оскільки ви можете працювати з відносним рухом ...

Ви можете заперечити попередні результати залежно від того, як розміщена камера

(Я додам кілька схем, коли матиму час)


2
Побитий @hardillb;) І він краще виглядає формулами ...
Goufalite

2
На жаль, підтримка LaTeX не доступна на цьому сайті. Ви можете експортувати його звідкись, як CodeCogs, хоч у зображення як заміну, якщо хочете. (Я зробив це для вас;
сміливо

Дякую обом за допомогу. Це саме те, що я шукав.
bot_bot

Я думаю, ви забули взяти до уваги той факт, що арктан для кута нахилу повинен бути відносно компонента z над гіпотенузою: розміщення його над y компонентом може підняти / опустити камеру недостатньо, оскільки камера буде вказують уздовж гіпотенузи прямого трикутника між y-складовою та x-компонентою, а не вздовж осі y. Виправте мене, якщо я помиляюся. :) Хоча чудова відповідь.
анонімний2

@ anonymous2, що теж було моєю думкою. Я не вважаю, що жоден із представлених відповідей насправді є правильним, але я не маю пропускної здатності, щоб реально показати це зараз - здається, вам потрібні два трикутники та всі три координати, щоб отримати змінну (панорамування або нахил). Ви можете довести це самому, візуалізуючи два різних крайніх приклади: x, y, z 1,1999 дасть набагато різні різні сковороди та набагато інший нахил, ніж 1,1,1. Відповідь Гуфаліта дає однакову сковороду для обох.
dwizum

6

Чудові відповіді вже, я просто хотів би додати ще кілька речей, які ви повинні взяти до уваги. Як уже згадували хардліб та гуфаліт, спосіб зробити це тригонометрично. Я намалював 2-денне зображення камери та об'єкта IoT:

введіть тут опис зображення

Як бачите, поле зору камери буде більшим, ніж об'єкт - якщо не в тісному діапазоні, коли об’єкт відсунеться далі.

Тепер, можливо , ви хочете, щоб камера завжди була зосереджена на об'єкті. У такому випадку ви можете просто взяти обчислення, на які посилається жорсткий перелік:

ϴ = arctan(y/x)

... який буде кутом проти годинникової стрілки від осі x, за умовою. Вам також знадобиться кут від рівня:

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

Очевидно, що вам доведеться обчислити вимкнення положення камери, що знаходиться біля початку в усіх трьох осях.

З іншого боку, ви можете віддати перевагу не змушувати камеру рухатися більше, ніж потрібно, тобто змушувати камеру рухатися лише після того, як об'єкт, здається, збирається вийти з кадру. У такому випадку ви, ймовірно, захочете змінну «тиску», яка зробить камеру більшою ймовірністю зміни свого кута, залежно від того, наскільки об'єкт знаходиться до краю кадру.

Якщо ви йдете цим маршрутом, вам потрібно знати кут поля зору камери в обох полях зору, щоб ви могли визначити, де об’єкт порівнюється з полем зору камери.


Це чудово! Дякую, на даний момент я хочу, щоб об’єкт був зосереджений у полі зору камер.
bot_bot

2
Під час панорамування / нахилу камери у мене є певна затримка (~ 0,5 секунди) між кожним замовленням, будьте
обачні

Хороший момент - це, безумовно, щось врахувати.
анонімний2

5

Зазвичай це робиться з базовою тригонометрією .

Почніть з роботи на одній дворівневій площині з камерою біля початку (0,0) та об'єктом з (x, y)

Враховуючи, що відстань x буде сусідньою стороною трикутника, а відстань y буде протилежною ви отримаєте:

tan (кут) = y / x

тому кут сковороди можна знайти при

Кут = invTan (у / х)

Ви також можете визначити відстань прямої лінії (гіпотенузи) між камерою та об'єктом за допомогою:

h ^ 2 = x ^ 2 + y ^ 2

Давання:

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

Тепер ви можете використовувати відстань h з висотою z, щоб обчислити кут нахилу таким же чином.

Коли ви отримаєте кути, ви зможете подати їх на те, що коли-небудь контролює панорамування / нахил на камері.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.