Wie kann ich einer Kamera programmgesteuert mitteilen, wohin sie zeigen soll?

8

Ich habe momentan keine bestimmte Kamera im Sinn, ich bin nur neugierig, wie dies programmatisch / mathematisch gemacht wird.

Ich habe einen 3D-Raum, ein Rechteck, mit einer Kamera in einer Ecke nach innen.
Ich habe ein sich bewegendes Objekt in diesem Rechteck, das (x, y, z) Koordinaten seiner aktuellen Position überträgt.
Ich möchte diese Koordinaten nehmen und sie in Anweisungen übersetzen, die der Kamera sagen, dass sie auf diese Position zeigen soll.
Wie erfolgt diese Übersetzung normalerweise?

bot_bot
quelle
Vielleicht möchten Sie sich ansehen, wie Spieleentwickler mit ihren Kameras im Spiel umgehen. Es ist das gleiche Prinzip und sie mussten sich sozusagen mit allem unter der Sonne auseinandersetzen.
Harabeck
Es kann erwähnenswert sein, dass das Objekt seine Koordinaten nicht im wörtlichen 3D-Raum übertragen muss, sondern im Sichtfeld der Kamera übertragen kann. Sie würden dann die Mustererkennung verwenden, um herauszufinden, wo sich das Objekt im Bild befindet, und dann die Kamera verschieben, um das Objekt zu zentrieren (oder auf andere Weise einen Bewegungsvektor in 2D identifizieren, indem Sie die Positionsänderung über mehrere Bilder hinweg verfolgen und sich in diese Richtung bewegen). . Zum Beispiel scannt meine PTZ-Kamera auf der Veranda die Veranda nach Bewegungen, die nicht auf die Schwenkbewegung zurückzuführen sind, und rastet dann ein und folgt dem sich bewegenden Objekt, bis die Bewegung stoppt.
Dannysauer
Mein Anwendungsfall ist ein Sportanalysesystem. Jeder Spieler trägt ein Etikett, das die aktuelle Position, Geschwindigkeit usw. auf dem Spielfeld überträgt. Wir haben also bereits die Positionsinformationen. Ich werde mir auf jeden Fall eine Mustererkennung ansehen. Klingt nützlich.
Bot_bot

Antworten:

10

Trigonometrie!

Meine Kamera ist eine DLink 5020-L und verfügt über Schwenk- / Neigebefehle , die über eine API gegeben werden können . Es muss auch vordefinierte Positionen festlegen und kann auch über die API ausgelöst werden

Pre-Init

  • Definieren Sie eine Position Ihrer Kamera auf 0 ° Schwenken und 0 ° Neigen in Ihrem Referential => Wir nennen diese Position Position 1

Drin

  • Bewegen Sie Ihre Kamera zu Position 1
  • Speichern Sie irgendwo das Schwenken / Neigen Ihrer Kamera, entweder in 0-initialisierten Variablen oder über Ihre API

Objekt anschauen

  • Suchen Sie Ihr Objekt in zwei Ebenen, der X-, Y- und der Y-, Z-Ebene
  • Sie können dann den Schwenkwinkel (links / rechts) erhalten (omg Mathematikformeln in einer IoT SE!)

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

  • Sie können dann den Neigungswinkel (nach oben / unten) erhalten

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

  • Vergessen Sie nicht, den neuen Schwenk- / Neigewert zu speichern / zu aktualisieren, da Sie möglicherweise mit Relativbewegungen arbeiten ...

Je nachdem, wie Ihre Kamera platziert ist, können Sie die vorherigen Ergebnisse negieren

(Ich werde einige Schaltpläne hinzufügen, wenn ich Zeit habe)

Goufalite
quelle
2
Von @hardillb geschlagen;) Und er hat besser aussehende Formeln ...
Goufalite
2
Leider ist die LaTeX-Unterstützung auf dieser Website nicht verfügbar. Sie können es von einem Ort wie CodeCogs in ein Bild als Ersatz exportieren, wenn Sie möchten . (Ich habe dies für Sie getan; Sie können es nach Bedarf bearbeiten oder entfernen, wenn Sie es nicht möchten!)
Aurora0001
Vielen Dank für Ihre Hilfe. Genau das habe ich gesucht.
Bot_bot
Ich denke, Sie haben vergessen, die Tatsache zu berücksichtigen, dass der Arktan für den Neigungswinkel in Bezug auf die z-Komponente über der Hypotenuse sein muss: Wenn Sie ihn über die y-Komponente legen, kann Ihre Kamera nicht ausreichend angehoben / abgesenkt werden, da dies der Fall sein wird zeigt entlang der Hypotenuse eines rechtwinkligen Dreiecks zwischen der y-Komponente und der x-Komponente, nicht entlang der y-Achse. Korrigiere mich, wenn ich falsch liege. :) Tolle Antwort.
anonym2
@ anonym2 das war auch mein gedanke. Ich denke, dass keine der vorgestellten Antworten tatsächlich richtig ist, aber ich habe momentan nicht die Bandbreite, um dies tatsächlich zu zeigen - es scheint, dass Sie zwei Dreiecke und alle drei Koordinaten benötigen, um entweder variabel zu werden (Schwenken oder Neigen). Sie können sich dies selbst beweisen, indem Sie zwei verschiedene extreme Beispiele visualisieren: x, y, z von 1,1,999 ergeben eine sehr unterschiedliche Schwenk- und Neigungsschwankung als 1,1,1. Goufalites Antwort gibt für beide die gleiche Pfanne.
Dwizum
6

Schon gute Antworten, ich möchte nur ein paar andere Dinge hinzufügen, die Sie berücksichtigen sollten. Wie Hardlib und Goufalite bereits erwähnt haben, ist der Weg dazu trigonometrisch. Ich habe eine 2-D-Darstellung der Kamera und des IoT-Objekts erstellt:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, ist das Sichtfeld der Kamera größer als das Objekt - wenn nicht im Nahbereich, wenn sich das Objekt weiter entfernt.

Jetzt möchten Sie vielleicht, dass die Kamera immer auf dem Objekt zentriert ist. In diesem Fall können Sie einfach die Berechnungen verwenden, auf die sich hardlib bezieht:

ϴ = arctan(y/x)

... der gemäß Konvention der Winkel gegen den Uhrzeigersinn von der x-Achse ist. Sie benötigen auch den Winkel von der Ebene weg:

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

Natürlich müssen Sie anhand der Kameraposition berechnen, die in allen drei Achsen am Ursprung liegt.

Auf der anderen Seite möchten Sie möglicherweise die Kamera nicht mehr als nötig bewegen, dh die Kamera erst dann bewegen, wenn sich das Objekt scheinbar aus dem Rahmen herausbewegt. In diesem Fall möchten Sie wahrscheinlich eine "Druck" -Variable, mit der die Wahrscheinlichkeit erhöht wird, dass die Kamera ihren Winkel ändert, je nachdem, wie nahe das Objekt am Rand des Rahmens liegt.

Wenn Sie diesen Weg gehen, müssen Sie den Winkel des Sichtfelds der Kamera in beiden Sichtfeldern kennen, damit Sie bestimmen können, wo das Objekt mit dem Sichtfeld der Kamera verglichen wird.

anonym2
quelle
Das ist toll! Vielen Dank, im Moment möchte ich das Objekt im Sichtfeld der Kamera zentrieren.
Bot_bot
2
Wenn ich meine Kamera schwenke / neige, habe ich zwischen jeder Bestellung eine gewisse Latenz (~ 0,5 Sekunden).
Achten Sie darauf
Guter Punkt - das ist definitiv etwas zu beachten.
anonym2
5

Dies erfolgt normalerweise mit grundlegender Trigonometrie .

Beginnen Sie mit der Arbeit an einer einzelnen 2D-Ebene mit der Kamera am Ursprung (0,0) und dem Objekt am (x, y).

Vorausgesetzt, der x-Abstand ist die benachbarte Seite des Dreiecks und der y-Abstand ist das Gegenteil, das Sie erhalten:

tan (Winkel) = y / x

so kann der Schwenkwinkel mit gefunden werden

Winkel = invTan (y / x)

Sie können auch den geraden Abstand (die Hypotenusen) zwischen der Kamera und dem Objekt berechnen mit:

h ^ 2 = x ^ 2 + y ^ 2

Geben:

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

Jetzt können Sie den h-Abstand mit der z-Höhe verwenden, um den Neigungswinkel auf die gleiche Weise zu berechnen.

Sobald Sie die Winkel haben, können Sie diese demjenigen zuführen, der das Schwenken / Neigen der Kamera steuert.

hardillb
quelle