Jak mogę programowo powiedzieć kamerze, gdzie ma wskazywać?

8

Nie mam teraz na myśli konkretnego aparatu, jestem tylko ciekawy, jak to się robi, programowo / matematycznie.

Mam przestrzeń 3D, prostokąt, z kamerą skierowaną do góry w jednym rogu.
Mam ruchomy obiekt w tym prostokącie, który przesyła współrzędne (x, y, z) swojej aktualnej pozycji.
Chcę wziąć te współrzędne i przetłumaczyć je na instrukcje mówiące kamerze, aby wskazywała to położenie.
Jak zazwyczaj wykonuje się to tłumaczenie?

bot_bot
źródło
Możesz przyjrzeć się, jak twórcy gier radzą sobie z kamerami w grze. To ta sama zasada i że tak powiem, musieli poradzić sobie ze wszystkim pod słońcem.
Harabeck
Warto zauważyć, że obiekt nie musi transmitować swoich współrzędnych w dosłownej przestrzeni 3D, ale raczej może transmitować będąc w polu widzenia kamery. Następnie użyjesz rozpoznawania wzorów, aby znaleźć miejsce w kadrze, w którym znajduje się obiekt, a następnie przesuń kamerę, aby wyśrodkować obiekt (lub w inny sposób zidentyfikuj wektor ruchu w 2D, śledząc zmianę położenia w wielu klatkach i poruszaj się w tym kierunku) . Na przykład moja kamera PTZ na ganku skanuje ganek, szukając ruchu nie z powodu ruchu panoramowania, a następnie blokuje się i podąża za ruchomym przedmiotem, aż ruch się zatrzyma.
dannysauer
Mój przypadek użycia to sportowy system analityczny, każdy gracz ma na sobie metkę, która przesyła aktualną pozycję, prędkość itp. Na boisko. Mamy już informacje o pozycji. Zdecydowanie przyjrzę się jednak rozpoznawaniu wzorów. Brzmi użytecznie.
bot_bot

Odpowiedzi:

10

Trygonometria!

Mój aparat to DLink 5020-L i ma polecenia panoramowania / pochylania, które można wydawać za pośrednictwem interfejsu API . Ma również predefiniowane pozycje do ustawienia, a także może być wyzwalane przez API

Przedinicjalizacja

  • Zdefiniuj pozycję kamery na 0 ° Pan i 0 ° Tilt w referencji => nazwiemy tę pozycję Position 1

W tym

  • Przenieś swój aparat do Position 1
  • Przechowuj gdzieś panoramę / pochylenie kamery, w zmiennych inicjowanych przez 0 lub za pośrednictwem interfejsu API

Spójrz na obiekt

  • Znajdź swój obiekt w dwóch płaszczyznach: X, Y i Y, Z
  • Możesz uzyskać kąt obrotu (lewy / prawy) (formuły matematyczne omg w IoT SE!)

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

  • Możesz wtedy uzyskać kąt pochylenia (góra / dół)

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

  • Nie zapomnij zapisać / zaktualizować nowej wartości obrotu / pochylenia, ponieważ możesz pracować z ruchem względnym ...

Możesz zanegować poprzednie wyniki w zależności od ustawienia aparatu

(Dodam trochę schematów, kiedy będę miał czas)

Goufalite
źródło
2
Pobity przez @hardillb;) I ma lepiej wyglądające formuły ...
Goufalite
2
Niestety wsparcie LaTeX nie jest dostępne na tej stronie. Możesz jednak wyeksportować go skądś jak CodeCogs do obrazu jako zamiennik, jeśli chcesz. (Zrobiłem to dla ciebie; możesz edytować w razie potrzeby lub usunąć, jeśli nie chcesz!)
Aurora0001
Dziękuje wam obojgu za waszą pomoc. Właśnie tego szukałem.
bot_bot
Myślę, że zapomniałeś wziąć pod uwagę fakt, że arctan dla kąta pochylenia musi być w odniesieniu do komponentu z ponad przeciwprostokątną: umieszczenie go nad komponentem y może niewystarczająco podnieść / obniżyć kamerę, ponieważ kamera będzie skierowany wzdłuż przeciwprostokątnej prostokąta trójkąta między składnikiem y i składnikiem x, a nie wzdłuż osi y. Popraw mnie, jeśli się mylę. :) Świetna odpowiedź.
anonimowy2
@ anonymous2 to też była moja myśl. Nie wydaje mi się, aby którakolwiek z przedstawionych odpowiedzi była w rzeczywistości prawidłowa, ale nie mam przepustowości, aby faktycznie to pokazać - wydaje się, że potrzebujesz dwóch trójkątów i wszystkich trzech współrzędnych, aby uzyskać zmienną (panoramowanie lub pochylanie). Możesz to sobie udowodnić, wizualizując dwa różne ekstremalne przykłady: x, y, z 1,1,999 da znacznie inne panoramowanie i inne pochylenie niż 1,1,1. Odpowiedź Goufalite daje tę samą patelnię dla obu.
dwizum
6

Świetne odpowiedzi, chciałbym tylko dodać kilka innych rzeczy, które powinieneś wziąć pod uwagę. Jak wspomniano już o Hardlib i Goufalite, sposób na zrobienie tego jest trygonometryczny. Narysowałem dwuwymiarowy obraz kamery i obiektu IoT:

wprowadź opis zdjęcia tutaj

Jak widać, pole widzenia kamery będzie większe niż obiekt - jeśli nie będzie z bliskiej odległości, gdy obiekt poruszy się dalej.

Teraz może chcą aparat zawsze na środku obiektu. W takim przypadku możesz po prostu wykonać obliczenia, do których odnosi się hardlib:

ϴ = arctan(y/x)

... który będzie kątem w kierunku przeciwnym do ruchu wskazówek zegara od osi x, zgodnie z konwencją. Będziesz także potrzebował kąta od poziomu:

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

Oczywiście musisz obliczyć na podstawie położenia kamery znajdującego się na początku we wszystkich trzech osiach.

Z drugiej strony, możesz nie chcieć, aby kamera poruszała się bardziej niż to konieczne, to znaczy, aby kamera poruszała się tylko wtedy, gdy obiekt wydaje się być bliski wyjścia z ramki. W takim przypadku prawdopodobnie będziesz potrzebować zmiennej „ciśnienia”, która zwiększy prawdopodobieństwo, że kamera zmieni kąt w zależności od odległości obiektu od krawędzi ramki.

Jeśli wybierzesz tę trasę, musisz znać kąt pola widzenia kamery w obu polach widzenia, abyś mógł określić, gdzie obiekt jest porównywany z polem widzenia kamery.

anonimowy2
źródło
To jest świetne! Dzięki, w tej chwili chcę utrzymać obiekt w centrum pola widzenia kamery.
bot_bot
2
Kiedy przesuwam / przechylam aparat, mam pewne opóźnienie (~ 0,5 sekundy) między każdym zamówieniem, uważaj na to podczas przenoszenia aparatu
Goufalite
Dobra uwaga - to zdecydowanie coś do rozważenia.
anonimowy2
5

Zwykle odbywa się to za pomocą podstawowej trygonometrii .

Zacznij od pracy nad pojedynczą płaską płaszczyzną 2D z kamerą na początku (0,0) i obiektem na (x, y)

Biorąc pod uwagę, że odległość x będzie sąsiadującym bokiem trójkąta, a odległość y będzie przeciwna do otrzymanej:

tan (kąt) = y / x

dzięki czemu można znaleźć kąt obrotu

Kąt = invTan (t / x)

Możesz także obliczyć odległość w linii prostej (przeciwprostokątne) między kamerą a obiektem za pomocą:

h ^ 2 = x ^ 2 + y ^ 2

Dający:

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

Teraz możesz użyć odległości h z wysokością z, aby obliczyć kąt pochylenia w ten sam sposób.

Po ustawieniu kątów możesz je karmić tym, co kiedykolwiek kontroluje panoramowanie / pochylanie w kamerze.

hardillb
źródło