Comment puis-je indiquer par programme à une caméra où pointer?

8

Je n'ai pas de caméra particulière en tête en ce moment, je suis simplement curieux de savoir comment cela se fait, par programmation / mathématique.

J'ai un espace 3D, un rectangle, avec une caméra dans un coin, regardant vers l'intérieur.
J'ai un objet en mouvement dans ce rectangle qui transmet (x, y, z) les coordonnées de sa position actuelle.
Je veux prendre ces coordonnées et les traduire en instructions indiquant à la caméra de pointer sur cette position.
Comment se fait généralement cette traduction?

bot_bot
la source
Vous voudrez peut-être voir comment les développeurs de jeux gèrent leurs caméras dans le jeu. C'est le même principe et ils ont dû tout gérer sous le soleil, pour ainsi dire.
Harabeck
Il convient de noter que l'objet n'a pas à transmettre ses coordonnées dans un espace 3D littéral, mais peut plutôt transmettre en étant dans le champ de vision de la caméra. Vous utiliseriez ensuite la reconnaissance des motifs pour trouver où se trouve l'objet dans le cadre, puis décaler la caméra pour centrer l'objet (ou autrement identifier un vecteur de mouvement en 2D en suivant le changement de position sur plusieurs cadres et vous déplacer dans cette direction) . Par exemple, ma caméra PTZ sur le porche scanne le porche à la recherche d'un mouvement non dû au mouvement de panoramique, puis se verrouille et suit l'élément en mouvement jusqu'à l'arrêt du mouvement.
dannysauer
Mon cas d'utilisation est un système d'analyse sportive, chaque joueur porte une étiquette qui transmet la position actuelle, la vitesse, etc. sur le terrain. Nous avons donc déjà les informations de position. Je vais certainement jeter un œil à la reconnaissance des formes. Cela semble utile.
bot_bot

Réponses:

10

Trigonométrie!

Mon appareil photo est un DLink 5020-L et possède des commandes de panoramique / inclinaison qui peuvent être fournies via une API . Il a également des positions prédéfinies à définir et peut également être déclenché via l'API

Pré-init

  • Définissez une position de votre caméra sur un panoramique 0 ° et une inclinaison 0 ° dans votre référentiel => nous appellerons cette position Position 1

Init

  • Déplacez votre appareil photo vers Position 1
  • Stockez quelque part le panoramique / l'inclinaison de votre caméra, soit dans des variables initialisées à 0, soit via votre API

Regardez l'objet

  • Localisez votre objet dans deux plans, les plans X, Y et Y, Z
  • Vous pouvez alors obtenir l'angle de panoramique (gauche / droite) (formules mathématiques omg dans un IoT SE!)

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

  • Vous pouvez alors obtenir l'angle d'inclinaison (haut / bas)

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

  • N'oubliez pas de sauvegarder / mettre à jour la nouvelle valeur de panoramique / inclinaison car vous pourriez travailler avec un mouvement relatif ...

Vous pouvez annuler les résultats précédents selon la façon dont votre appareil photo est placé

(J'ajouterai quelques schémas quand j'aurai le temps)

Goufalite
la source
2
Battu par @hardillb;) Et il a des formules plus
belles
2
Malheureusement, le support LaTeX n'est pas disponible sur ce site. Vous pouvez l'exporter de quelque part comme CodeCogs mais dans une image comme substitut si vous le souhaitez. (Je l'ai fait pour vous; n'hésitez pas à le modifier au besoin ou à le supprimer si vous ne le souhaitez pas!)
Aurora0001
Merci à vous deux pour votre aide. Ceci est exactement ce que je cherchais.
bot_bot
Je pense que vous avez oublié de prendre en compte le fait que l'arctan pour l'angle d'inclinaison doit être par rapport à la composante z au-dessus de l'hypoténuse: le placer sur la composante y pourrait soulever / abaisser votre caméra insuffisamment car la caméra va être pointé le long de l'hypoténuse d'un triangle rectangle entre la composante y et la composante x, pas le long de l'axe y. Corrige moi si je me trompe. :) Excellente réponse, cependant.
anonyme2
@ anonymous2 c'était ma pensée aussi. Je ne pense pas qu'aucune des réponses présentées ne soit encore correcte, mais je n'ai pas la bande passante pour le montrer en ce moment - il semble que vous ayez besoin de deux triangles et des trois coordonnées pour obtenir une variable (panoramique ou inclinaison). Vous pouvez le prouver par vous-même en visualisant deux exemples extrêmes différents: x, y, z de 1,1,999 vont donner un panoramique différent et une inclinaison très différente de 1,1,1. La réponse de Goufalite donne le même pan pour les deux.
dwizum
6

Excellentes réponses déjà, je voudrais juste ajouter quelques autres choses que vous devriez prendre en considération. Comme hardlib et Goufalite l'ont déjà mentionné, la façon de le faire est de manière trigonométrique. J'ai dessiné une représentation 2D de la caméra et de l'objet IoT:

entrez la description de l'image ici

Comme vous pouvez le voir, le champ de vision de la caméra va être plus grand que l'objet - s'il n'est pas à courte portée, lorsque l'objet s'éloigne davantage.

Maintenant, vous voudrez peut - être que la caméra soit toujours centrée sur l'objet. Dans ce cas, vous pouvez simplement prendre les calculs référencés par hardlib:

ϴ = arctan(y/x)

... qui sera l'angle dans le sens antihoraire de l'axe des x, par convention. Vous aurez également besoin de l'angle par rapport au niveau:

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

Évidemment, vous devrez calculer en fonction de la position de la caméra à l'origine sur les trois axes.

D'un autre côté, vous préférerez peut-être ne pas faire bouger la caméra plus que nécessaire, c'est-à-dire que la caméra ne bouge que lorsque l'objet semble sur le point de sortir du cadre. Dans ce cas, vous voudrez probablement une variable de "pression" qui rendra la caméra plus susceptible de changer son angle en fonction de la distance entre l'objet et le bord du cadre.

Si vous suivez cette route, vous devrez connaître l'angle du champ de vision de la caméra dans les deux champs de vision, afin de pouvoir déterminer où l'objet est comparé au champ de vision de la caméra.

anonyme2
la source
C'est bien! Merci, pour le moment, je veux garder l'objet centré dans le champ de vision des caméras.
bot_bot
2
Lorsque je panoramique / incline mon appareil photo, j'ai une latence (~ 0,5 seconde) entre chaque commande, méfiez-vous de cela lorsque vous déplacez votre appareil photo
Goufalite
Bon point - c'est certainement quelque chose à considérer.
anonyme2
5

Cela se fait normalement avec la trigonométrie de base .

Commencez par travailler sur un seul plan plat 2D avec la caméra à l'origine (0,0) et l'objet à (x, y)

Étant donné que la distance x sera le côté adjacent du triangle et la distance y sera l'opposé que vous obtenez:

bronzage (angle) = y / x

de sorte que l'angle de panoramique peut être trouvé avec

Angle = invTan (y / x)

Vous pouvez également calculer la distance en ligne droite (les hypoténuses) entre la caméra et l'objet avec:

h ^ 2 = x ^ 2 + y ^ 2

Donnant:

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

Vous pouvez maintenant utiliser la distance h avec la hauteur z pour calculer l'angle d'inclinaison de la même manière.

Une fois que vous avez les angles, vous pouvez les appliquer à ce qui contrôle le panoramique / l'inclinaison de la caméra.

hardillb
la source