Come posso dire a livello di codice a una telecamera dove puntare?


8

Non ho in mente una macchina fotografica particolare in questo momento, sono solo curioso di sapere come si fa, programmaticamente / matematicamente.

Ho uno spazio 3D, un rettangolo, con una telecamera in un angolo rivolta verso l'interno.
Ho un oggetto in movimento in quel rettangolo che sta trasmettendo le coordinate (x, y, z) della sua posizione attuale.
Voglio prendere quelle coordinate e tradurle in istruzioni che dicono alla telecamera di indicare quella posizione.
Come viene generalmente eseguita questa traduzione?


Potresti voler esaminare come gli sviluppatori di giochi gestiscono le loro telecamere di gioco. È lo stesso principio e hanno dovuto affrontare tutto sotto il sole, per così dire.
Harabeck,

Vale la pena notare che l'oggetto non deve trasmettere le sue coordinate nello spazio letterale 3D, ma potrebbe piuttosto trasmettere trovandosi nel FOV della fotocamera. Dovresti quindi utilizzare il riconoscimento del modello per trovare dove si trova l'oggetto nel riquadro, quindi spostare la telecamera per centrare l'oggetto (o altrimenti identificare un vettore di movimento in 2D monitorando il cambiamento di posizione su più fotogrammi e spostandoti in quella direzione) . Ad esempio, la mia telecamera PTZ sotto il portico esegue la scansione del portico cercando un movimento non dovuto al movimento di panoramica, quindi si blocca e segue l'elemento in movimento fino a quando il movimento non si ferma.
dannysauer,

Il mio caso d'uso è un sistema di analisi sportiva, ogni giocatore indossa un tag che trasmette la posizione attuale, la velocità, ecc. Sul campo. Quindi abbiamo già le informazioni sulla posizione. Sicuramente darò un'occhiata a un riconoscimento del modello però. Sembra utile.
bot_bot

Risposte:


10

Trigonometria!

La mia fotocamera è una DLink 5020-L e ha comandi di panoramica / inclinazione che possono essere forniti tramite un'API . Ha anche posizioni predefinite da impostare e può anche essere attivato tramite API

Pre-init

  • Definisci una posizione della tua telecamera su una panoramica di 0 ° e una inclinazione di 0 ° nel tuo riferimento => chiameremo questa posizione Position 1

Dentro

  • Sposta la fotocamera su Position 1
  • Memorizza da qualche parte la panoramica / inclinazione della videocamera, in variabili 0 inizializzate o tramite l'API

Guarda l'oggetto

  • Individua il tuo oggetto su due piani, i piani X, Y e Y, Z.
  • È quindi possibile ottenere l'angolo di pan (sinistra / destra) (omg formule matematiche in un IoT SE!)

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

  • È quindi possibile ottenere l'angolo di inclinazione (su / giù)

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

  • Non dimenticare di salvare / aggiornare il nuovo valore di panoramica / inclinazione poiché potresti lavorare con movimenti relativi ...

È possibile annullare i risultati precedenti a seconda di come è posizionata la fotocamera

(Aggiungerò alcuni schemi quando avrò tempo)


2
Picchiato da @hardillb;) E ha delle formule più
belle

2
Sfortunatamente il supporto LaTeX non è disponibile su questo sito. Se lo desideri, puoi esportarlo da qualche parte come CodeCogs in un'immagine come sostituto. (L'ho fatto per te; sentiti libero di modificarlo come richiesto o rimuoverlo se non lo vuoi!)
Aurora0001

Grazie ad entrambi per il vostro aiuto. Questo e 'esattamente quello che stavo cercando.
bot_bot

Penso che ti sei dimenticato di prendere in considerazione il fatto che l'arcano per l'angolo di inclinazione deve essere rispetto al componente z rispetto all'ipotenusa: posizionarlo sopra il componente y potrebbe sollevare / abbassare la fotocamera in modo insufficiente poiché la fotocamera sarà puntato lungo l'ipotenusa di un triangolo rettangolo tra il componente y e il componente x, non lungo l'asse y. Correggimi se sbaglio. :) Ottima risposta, però.
anonymous2

@ anonymous2 anche quello era il mio pensiero. Non credo che nessuna delle risposte presentate sia in realtà corretta, ma non ho la larghezza di banda per mostrarlo effettivamente in questo momento - sembra che tu abbia bisogno di due triangoli e tutte e tre le coordinate per ottenere una variabile (panoramica o inclinazione). Puoi dimostrarlo a te stesso visualizzando due diversi esempi estremi: x, y, z di 1.1.999 fornirà una panoramica molto diversa e un'inclinazione molto diversa rispetto a 1,1,1. La risposta di Goufalite dà la stessa padella per entrambi.
dwizum,

6

Ottime risposte già, vorrei solo aggiungere alcune altre cose che dovresti prendere in considerazione. Come già menzionato hardlib e Goufalite, il modo per farlo è trigonometrico. Ho disegnato una rappresentazione 2-d della videocamera e dell'oggetto IoT:

inserisci qui la descrizione dell'immagine

Come puoi vedere, il campo visivo della telecamera sarà più grande dell'oggetto - se non a distanza ravvicinata, quando l'oggetto si sposta più lontano.

Ora, si potrebbe desiderare la fotocamera sempre centrato sull'oggetto. In tal caso, puoi semplicemente prendere i calcoli a cui fa riferimento hardlib:

ϴ = arctan(y/x)

... che sarà l'angolo in senso antiorario dall'asse x, per convenzione. Avrai anche bisogno dell'angolo lontano dal livello:

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

Ovviamente, dovrai calcolare in base alla posizione della telecamera all'origine in tutti e tre gli assi.

D'altro canto, potresti preferire non far muovere la videocamera più del necessario, ovvero far muovere la videocamera solo quando l'oggetto sembra stia per uscire dalla cornice. In tal caso, probabilmente vorrai una variabile di "pressione" che aumenti la probabilità che la videocamera cambi l'angolazione in base alla vicinanza dell'oggetto al bordo dell'inquadratura.

Se segui quel percorso, dovrai conoscere l'angolo del campo visivo della videocamera in entrambi i campi visivi, in modo da poter determinare dove l'oggetto viene confrontato con il campo visivo della videocamera.


Questo è fantastico! Grazie, al momento voglio mantenere centrato l'oggetto nel campo visivo delle telecamere.
bot_bot

2
Quando eseguo una panoramica / inclinazione della mia fotocamera ho un po 'di latenza (~ 0,5 secondi) tra ogni ordine, attenzione quando si sposta la fotocamera
Goufalite

Un buon punto: è sicuramente qualcosa da considerare.
anonymous2

5

Questo è normalmente fatto con la trigonometria di base .

Inizia lavorando su un unico piano 2d con la telecamera all'origine (0,0) e l'oggetto a (x, y)

Dato che la distanza x sarà il lato adiacente del triangolo e la distanza y sarà l'opposto che otterrai:

abbronzatura (angolo) = y / x

quindi l'angolo di panoramica può essere trovato con

Angolo = invTan (y / x)

Puoi anche calcolare la distanza in linea retta (gli ipoteni) tra la fotocamera e l'oggetto con:

h ^ 2 = x ^ 2 + y ^ 2

Dando:

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

Ora puoi usare la distanza h con l'altezza z per calcolare l'angolo di inclinazione allo stesso modo.

Una volta che hai gli angoli, puoi alimentare questi a qualunque cosa stia controllando la panoramica / inclinazione sulla videocamera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.