12
votes

Comment calculer une distance spécifique à l'intérieur d'une image?

Désolé pour mon mauvais anglais. J'ai le problème suivant:

1

permet de dire que la caméra de mon appareil mobile montre cette image.

Dans la photo, vous pouvez voir 4 positions différentes. Chaque position est connue pour moi (longitude, latitude).

Maintenant, je veux savoir, où se trouve dans la photo d'une position spécifique. Par exemple, je veux avoir un rectangle de 20 mètres à l'avant et 5 mètres à gauche de moi. Je sais juste la latitude / la longitude de ce point, mais je ne sais pas, où je dois le placer à l'intérieur de la photo (x, y). Par exemple, POS3 est à (0 400) à mon avis. POS4 est à (600 400) et ainsi de suite.

Où dois-je mettre le nouveau point, à 20 mètres à l'avant et à 5 mètres à gauche de moi? (Donc, mon entrée est: (latértexy, lonxy) et mon résultat doit être (x, y) à l'écran)

J'ai aussi une hauteur de la caméra et des angles de x, y et z - axe de la caméra.

Puis-je utiliser des opérations mathématiques simples pour résoudre ce problème?

Merci beaucoup!


2 commentaires

Votre question n'est pas claire. Si vous savez que la position est de 20 mètres d'avance et 5 à gauche, que exactement essayez-vous de calculer?


Désolé ..., j'aimerais savoir, où se trouve la position à l'intérieur de la photo. J'ai besoin d'un point (x, y) à l'intérieur de ma vue, où je peux "marquer" la position.


3 Réponses :


3
votes

Si vous connaissez les points dans le cadre de la caméra et le monde réel coordonnant une algèbre linéaire simple suffira. Un paquet comme OpenCV aura ce type de fonctionnalité ou vous pouvez également créer vous-même les matrices de projection:

http://fr.wikipedia.org/wiki/3d_projection

Une fois que vous avez un ensemble de points, il est aussi simple que de remplir quelques vecteurs pour résoudre le système d'équations. Cela vous donnera une matrice de projection. Une fois que vous avez une matrice de projection, vous pouvez supposer que les 4 points sont plan. Multipliez une coordonnée 3D pour trouver la coordonnée de plan d'image 2D correspondante.


3 commentaires

Merci pour la réponse! Pouvez-vous me donner un petit indice, où je dois commencer? Je ne connais pas très bien les projections et je ne sais pas ce que je dois faire :(


Voici un lien vers une description du processus (si c'est fait à la main) Stackoverflow.com/questions/8925569/... . Je aplogise, mais ma classe graphique de l'ordinateur était il y a quelques années. OpenCV est une bibliothèque de vision d'ordinateur forte qui possède une fonctionnalité d'étalonnage: docs.opencv .org / doc / Tutorials / Calib3D / Camera_calibration / ... Les termes principaux que vous devriez rechercher sont: Calibrage de la caméra, matrice de projection, Système d'équations.


Hé, j'ai réagi à ma question et savez avoir un problème avec la matrice de projection. Aussi, j'ai ajouté une prime sur cette question;). Pouvez-vous jeter un coup d'oeil? Merci :)



5
votes

Je vois quelques problèmes.

La seule vraie erreur est vous augmentez l'échelle de votre projection par _canvasWidth / 2 etc au lieu de traduire loin du point principal - ajouter les valeur au résultat projeté, la multiplication est comme « zoom » loin dans la projection.

En second lieu, le traitement dans un espace global de coordonnées cartésiennes est une mauvaise idée. Avec les formules que vous utilisez, la différence entre (60,1234, 20.122) et (60,1235, 20,122) (à savoir une petite différence de latitude) provoque des changements d'une ampleur similaire dans les 3 axes qui ne se sent pas bien.

Il est plus simple de prendre la même approche que l'infographie: réglez votre appareil photo comme l'origine de votre « espace de la caméra », et convertir entre des objets du monde et l'espace de la caméra en obtenant la distance Haversine (ou similaire) entre l'emplacement de votre appareil photo et l'emplacement de l'objet. Voir ici: http://www.movable-type.co.uk/scripts/latlong.html

Troisième vos calculs de projection en perspective sont une caméra sténopé idéal, que vous n'avez probablement pas. Il ne sera une petite correction, mais pour être précis, vous devez comprendre comment appliquer en outre la projection qui correspond aux paramètres intrinsèques de la caméra de votre appareil photo. Il y a deux façons d'y parvenir: vous pouvez le faire comme une multiplication post au régime que vous avez déjà, ou vous pouvez changer de multiplier par une matrice de 3x3 à l'aide d'une matrice de la caméra complète 4x4: http://en.wikipedia.org/wiki/Camera_matrix avec les paramètres là-dedans.

En utilisant cette approche, la projection en perspective est symétrique par rapport à l'origine - si vous ne cochez pas la profondeur z vous projetez des points derrière vous sur vous l'écran comme si elles étaient à la même distance z devant vous.

Alors enfin je ne sais pas sur les API Android, mais assurez-vous que vous obtenez vrai roulement nord et non palier magnétique nord. Certains retournent la plate-forme soit en fonction d'un argument ou configuration. (Et vos diplômes sont en radians si c'est ce que les API veulent etc - des choses stupides, mais j'ai perdu des heures de débogage moins :)) .


6 commentaires

WOOOAH! Merci pour la réponse vraiment informative! Je vais suivre vos idées et le tester à nouveau;). Mais j'ai toujours une question ouverte: où devrais-je utiliser dans cette formule les angles de vue horizontale et verticale de mon appareil photo? Je ne pense pas que je puisse obtenir un bon résultat sans utiliser ces valeurs, n'est-ce pas? Merci encore!


Si, par angles, vous voulez dire les angles de vue de la lentille, ceux-ci sont (à une approximation) déterminé par la longueur focale et la résolution de l'écran. L'ajout de la longueur focale à la matrice de la caméra "résoudre" cela. (Si vous aviez un écran carré et que la vue de votre capteur a été recadrée en conséquence, les angles seraient égaux) ...


... Une autre manière consiste à simplement utiliser la trigonométrie de base et les roulements relatifs: du point central de votre vue au bord est un triangle droit avec angle d'affichage à angle 1/2 (appelons-le alpha), qui occupe des pixels à l'écran. Votre point virtuel est Beta degrés par rapport au centre. L'emplacement à l'écran U, de votre point virtuel est TAN (BETA) / TAN (Alpha) * x - Répéter pour les deux axes (aucune matrice de projection n'est requise, vous ne le faites pas manuellement. Je ne me souviens pas si le port relatif est plus précis. à de courtes distances à l'aide de l'approche de la caméra à l'origine ou à l'aide de roulements de coordonnées sphériques avec des coordonnées GPS


... et je dis «à une approximation» car si vous utilisez un téléphone mobile, ils disposent principalement d'affichages à écran large pouvant avoir une distorsion non linéaire dans un ou les deux axes - pour vraiment corriger que vous auriez Pour effectuer un calibrage de la caméra, mais si vous utilisez GPS pour la localisation et les capteurs de base des téléphones pour positionner, votre emplacement et votre position de position seront plutôt pauvres pour commencer.


Merci encore pour vos réponses! J'ai récompensé avec une prime;) On dirait que tu as fait quelque chose comme ça. Avez-vous un code open-source dans lequel je peux jeter un coup d'oeil? Merci beaucoup :)


Pas de code open source Malheureusement, bien que je n'ai envie de le faire pendant une longue période - des questions sur la projection de la perspective sont très fréquentes ici.



5
votes

La réponse que vous souhaitez dépendra de l'exactitude du résultat dont vous avez besoin. Comme Danaid a souligné, une non linéarité dans le capteur d'image et d'autres facteurs, tels que la distorsion atmosphérique, peut induire des erreurs, mais des problèmes difficiles à résoudre avec différentes caméras, etc., sur différents appareils. Commençons donc à obtenir une approximation raisonnable qui peut être modifiée comme une plus grande précision est nécessaire.

Premièrement, vous pourrez peut-être ignorer les informations directionnelles de l'appareil, si vous le souhaitez. Si vous avez les cinq endroits (POS1 - POS4 et CAMERA, dans une base de coordonnées constante, vous avez tout ce dont vous avez besoin. En fait, vous n'avez même pas besoin de tous ces points. P>

Note sur des coordonnées cohérentes. À sa balance, une fois que vous utilisez la convertie des convertissements de la Lat et de Long to mètres, utilisez COS (Lat) pour votre facteur de mise à l'échelle, vous devriez être capable de traiter tout le monde d'une perspective de "terre plate". Vous devez alors avoir juste besoin de N'oubliez pas que l'avion XY de la caméra est à peu près le plan XZ global XZ. P>

fond conceptuel fort> Le diagramme ci-dessous dépose la projection des points sur le plan d'image. Le DZ utilisé pour la perspective peut être dérivé directement en utilisant la proportion de la distance en vue entre les points de FAR et les points proches, vs. Leur distance physique. Dans le cas simple fort> où la ligne POS1 à POS2 est parallèle à la ligne POS3 à POS3, le facteur de perspective n'est que le rapport de la mise à l'échelle des deux lignes: P>

tp.x = pos1.x + ((pos3.x-pos1.x)*((TP.x/TP.y)-(POS1.x/POS1.y))/((POS3.x/POS3.y)-(POS1.x/POS1.y))


10 commentaires

Hey. Si je comprends votre réponse à droite, je dois juste interpoler entre les points donnés. Eh bien ... je ne suis pas tout à fait sûr si cela me donne de bonnes valeurs. Par exemple, dans ma photo, la position entre P1 et P3 (je veux dire exactement la manière exacte de P1 à P3 (en mètres, pas à l'écran) doit être de 1-2 centimètres sous l'emplacement de P3 sur l'image. Si je suis En utilisant votre conseil, l'emplacement doit être exactement au milieu de P1 et P3. Traduit en mètres, la "nouvelle" position serait d'env. 2-3 mètres devant P1.


Je pense que ma réponse est très peu claire. Je voulais dire ce qui suit: permet de dire que P3 est de 20 cm devant la caméra. P1 est env. 120 mètres devant la caméra. Maintenant, je veux trouver PX qui devrait être de 60 mètres devant la caméra. Avec votre solution, ce serait au milieu de P1 et P3, mais il devrait être quelque part à côté de P1.


Je suis désolé que je n'étais pas plus clair. L'interpolation doit être pondérée par la distance entre le point focal. C'est le but de la coordonnée W des coordonnées homogènes. Je vais essayer de trouver une référence plus claire et de mettre à jour ma réponse.


J'ai mis à jour ma réponse pour clarifier la manière dont l'interpolation est appliquée. Désolé, ce n'était pas clair plus tôt!


Ceci est juste incroyable! Je ne sais pas comment vous remercier! Merci beaucoup!


Laissez-nous Continuez cette discussion en chat


Je ne peux pas vous remercier assez! Ce chat était absolument incroyable. Merci pour ton aide!


C'est un peu de sinus que vous avez répondu à cela, mais je me demande comment je peux facilement calculer facilement TP.Y. Vous avez dit "pour la hauteur, c'est la même chose, mais comme si vous faites pivoter l'image de 90 degrés à gauche, en supposant que vos coordonnées d'écran commencent en haut à gauche." - Pouvez-vous décrire, qu'est-ce que vous vouliez dire exactement avec ça? ;)


Sur de nombreux systèmes, mais pas tous, le coin supérieur gauche de votre écran contient la coordonnée (x, y) (0,0), avec des valeurs positives de y baissant et des valeurs positives de x aller à droite. La rotation de 90 degrés met l'axe de Y positif de l'image à la place de l'axe X positif et le calcul TP.x donnera maintenant une distance verticale (-Height ou TP.Y). Essayez de faire pivoter votre photo et je pense que vous verrez ce que je veux dire. J'espère que cela a du sens!


Hé, merci pour la réponse rapide! Je comprends ce que vous voulez dire avec la rotation de l'image, mais si je le fais pivoter, je dois recalculer les distances des points, n'est-ce pas? Merci encore ;)