Calibrage de la caméra / modèle de caméra à trou d'épingle et élaboration de la position 3D

10

J'ai une caméra calibrée et j'ai les paramètres intrinsèques. J'ai également les paramètres extrinsèques relatifs à un point (l'origine du monde) sur une surface plane dans le monde réel. Ce point que j'ai défini comme origine dans les coordonnées du monde réel [0,0,0] avec une normale de [0,0,1].

À partir de ces paramètres extrinsèques, je peux déterminer la position et la rotation de la caméra dans les coordonnées 3D du plan mondial en utilisant ceci ici: http://en.wikipedia.org/wiki/Camera_resectioning

Maintenant, j'ai un deuxième point dont j'ai extrait les coordonnées de l'image pour [x, y]. Comment puis-je maintenant obtenir la position 3D de ce point dans le système de coordonnées mondial?

Je pense que l'intuition ici est que je dois tracer un rayon qui va du centre optique de la caméra (dont j'ai maintenant la position 3D comme décrit ci-dessus), à travers le plan d'image [x, y] de la caméra, puis à travers mon avion du monde réel que j'ai défini en haut.

Maintenant, je peux intersecter un rayon 3D de coordonnées mondiales avec un plan comme je le sais normal et pointer sur ce plan. Ce que je ne comprends pas, c'est comment je trouve la position et la direction 3D quand il quitte le plan d'image à travers un pixel. C'est la transformation à travers différents systèmes de coordonnées qui me déroute.

guépard
la source
Vérifiez cette réponse, cela peut vous aider. Si vous pensez que quelque chose peut / pourrait être terminé, dites-le moi. dsp.stackexchange.com/a/2737/1473
Jav_Rock

Réponses:

6

Si vous avez les extrinsèques, c'est très facile. Avoir des extrinsèques, c'est comme avoir une "pose de caméra" et comme avoir l'homographie. Vérifiez ce post dans stackoverflow.

Vous avez des extrinsèques, également appelées pose de caméra, qui sont décrites comme une translation et une rotation:

Pose=[R|t]=[R11R12R13txR21R22R23tyR31R32R33tz]

Vous pouvez obtenir l' homographie de Pose de cette façon:

H=1tz[R1xR2xtxR1yR2ytyR1zR2ztz]

Ensuite, vous pouvez projeter vos points 2D dans les points 3D correspondants en multipliant l'homographie par les points:

p2D=[xy1] ajouter z=1 pour les rendre homogènes

p3D=Hp2D

p=p/p(z) Normaliser les points

Jav_Rock
la source
que voulez-vous dire par p (z) ici?
Belal Homaidan
3

Vous avez deux options, utilisez la rétroprojection ou la projection entre deux plans (homographie).

P

P=K[RRC]Xreprojected=P+x

CXV=ω[XYZ1]Tω=1

u=XreprojectedCv=uuL(t)=C+tv

Π=[π1π2π3π4]T,π1X+π2Y+π3Z+π4=0L(t)=Πt

3×3H

Xplane=[XY01]Tx=PXplane=H[XY1]T

x

Xplane=H1x

H

H=R+1dTNT

dT=RC

buq2
la source
2

Vous ne pouvez pas connaître la position 3D du deuxième point. Il peut s'agir de n'importe quel point du rayon depuis votre centre de la caméra jusqu'à l'infini.

Vous pouvez effectuer les opérations suivantes:

  • Créez un espace 3D prédéfini qui ressemble à la scène de la vie réelle
  • Obtenez plus de points d'images sous un angle différent, en utilisant l'intersection des rayons sous différents angles, vous pouvez obtenir une approximation du point 3D.
Geerten
la source
Attendre. Je peux trouver le point du monde 3D que le rayon 3D coupe la surface plane, sûrement? Comme je connais une coordonnée du monde 3D et une normale du monde 3D de ce plan ..... le point 3D que j'essaye de trouver est le point où il coupe cette surface plane !! (Désolé, je pense que mon explication n'était pas assez bonne)
Cheetah
Que voulez-vous dire par surface plane? Le plan de l'image ou le plan des coordonnées du monde nul? Dans ce dernier cas, vous pouvez calculer l'intersection, mais cela signifie que votre scène 3D n'est pas 3d, mais 2d :) (car c'est un plan).
Geerten
Ouais désolé, ça ne m'est pas venu à l'esprit. Je comprends ce que vous dites, cela n'a pas vraiment de sens pour moi visuellement. Donc, oui, ma scène est en fait "2d" parce que j'ai le plan image et j'ai le plan monde réel, sur lequel se trouve l'origine du monde réel [0,0,0] et a une normale du monde réel de [0,0, 1], donc chaque point qui se trouve sur ce plan du monde réel est sous la forme de [x, y, 0]. Je sais que je peux calculer l'intersection si ax + by + cz + d = 0, mais c'est ce avec quoi j'ai du mal. (À suivre dans le prochain commentaire)
Cheetah
J'ai un rayon qui commence au centre / origine de ma caméra pour lequel j'ai le monde réel [x, y, z] et un monde réel normal [nx, ny, nz]. J'ai besoin de tirer un rayon à partir de ce point qui coupe le plan image en [u, v] puis coupe le plan du monde réel en [x, y, 0] (c'est ce x, y que je veux obtenir). Ce qui me pose problème, c'est le premier bit, l'intersection avec le plan image. Je ne vois pas comment je fais ça?
Cheetah
Vous voudrez peut-être regarder: en.wikipedia.org/wiki/Line-plane_intersection
Geerten