9

I ont un certain nombre de caméras calibrées de prendre une photo de la scène plane. Pour simplifier supposons qu'il y a 3 caméras. Ces caméras subissent un mouvement général, mais surtout la traduction plus une légère rotation. Example positions of camerasreprojection de pixels d'une image dans une autre

La tâche consiste à les assembler tout à fait. Je n'ai aucune connaissance sur les coordonnées 3D, juste un ensemble d'images prises avec des caméras calibrées.

Ce que je fais:

Je détecte les caractéristiques avec SURF/EIPD mises en œuvre dans OpenCV pour obtenir homographies initiale en utilisant findHomography entre chaque paire d'images (1> 2, 2-> 3, 1-> 3). A partir de ces homographies, j'obtiens l'esitimation initiale des poses de chaque caméra (similiar procedure to this)

Puis j'essaie d'utiliser la technique de réglage du faisceau pour minimiser l'erreur de reprojection pour chaque paire correspondante. Les paramètres optimisés sont trois valeurs de translation et trois valeurs de rotation (obtenues à partir de la formule de rotation de Rodrigues) bien que je puisse ajouter des paramètres intrinsèques plus tard (focales, points principaux, etc.).

En supposant image # 2 sera cadre de référence (en ayant le plus grand nombre de matches à deux autres images) sa rotation et les matrices sont traduction identité et zéro matrices respectivement.

je calculer reprojection de keypoint (visible à la fois dans l'image 2 et l'image n ° 1) à partir de l'image n ° 2 à image # 1 (pseudocode)

[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2; 
x1 = x1_/z1_; 
y1 = y1_/z1_; 

ou

x1 = ((f1/f2)*r11*x2 + (f1/f2)*r12*y2 + f1*r13 + f1*tx/Z2)/((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + tx/Z2) 
y1 = ((f1/f2)*r21*x2 + (f1/f2)*r22*y2 + f1*r23 + f1*ty/Z2)/((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + ty/Z2) 

où r__ sont des éléments de matrice, et les deux R1 matrices intrinsèques sont sous la forme de

[f 0 0] 
[0 f 0] 
[0 0 1] 

Je suppose Z2 coo La prochaine étape consiste à déformer les images n ° 1 et n ° 3 en un système de coordonnées commun de l'image n ° 2 en utilisant des matrices de caméra obtenues (K1, R1, T1, K3, R3, T3).

Le problème est que je ne sais rien de Z1 et Z3 nécessaire pour reprojection correcte dans cadre de référence de l'image # 2 car inverti reprojection de l'image # 1 -> # 2 ressemble à ceci:

x2 = ((f2/f1)*R11*x1 + (f2/f1)*R12*y1 + f2*R13 - f0/Z1*(R11*tx + R12*ty + R13*tz))/((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz)) 
y2 = ((f2/f1)*R21*x1 + (f2/f1)*R22*y1 + f2*R23 - f0/Z1*(R21*tx + R22*ty + R23*tz))/((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz)) 

où R__ sont des éléments de la matrice inv (R1).

est-il une meilleure façon de calculer l'erreur de reprojection pour le réglage du faisceau (2d-> 2d), puis des images gauchissement dans le système de coordonnées commun? J'ai remarqué que OpenCV a un cadre très similaire dans son module de couture mais il fonctionne sous l'hypothèse d'un mouvement de rotation pure ce qui n'est pas le cas ici.

+0

Avez-vous pensé à la triangulation 3D? Vous pourriez par exemple trianguler un point avec toutes les caméras sauf une et le reprojeter dans le dernier. – cedrou

Répondre

1

J'autoanswered cette question dans mon post How to get points in stereo image from extrinsic parameters

Notez que la méthode que je l'utilise (testé et fonctionnel!) Est valable uniquement si l'objet en coordonnées 3D (monde réel!) Est plane et il est à Z = 0 (le point où vous avez étalonné les paramètres extrinsèques des caméras). Dans ce cas, cette méthode est aussi précise que votre étalonnage. Note: pour le meilleur calibrage vérifier les calibrages de cercle openCVs, il y a une erreur de reproyection de 0,018 pixels (testée par un étudiant en thèse travaillant dans mon université).

0

Vous avez probablement découvert un bug sur l'erreur de repojection. Cela a à voir avec cette ligne:

[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2; 

Le point [x2; y2; 1] est ambigu jusqu'à une constante d'échelle, C * [x2; y2; 1] et ici vous définissez C = 1 quand il est généralement inconnu. Le lieu des possibilités se manifeste sous la forme d'une ligne épipolaire dans la première vue. Vous pouvez utiliser des moindres carrés triangulation pour trouver le point le plus probable le long de cette ligne que le point 3D existe, puis calculer le point comme prévu re-:

[x1_; y1_; z1_] = K1*(R1*X + T1); 

et à partir de là que vous avez ci-dessus. Les coordonnées 3D de chacun de ces points X dans votre nuage de points peuvent être calculées en utilisant ses coordonnées normalisées correspondantes (x1, y1), (x2, y2), ..., ainsi que les matrices de rotation et les vecteurs de translation correspondants, en les formatant le problème de la matrice:

A X = b 

et ensuite la résolution des moindres carrés:

min |A X - b|_2 

qui est illustré aux pages 3 et 4 here.

Questions connexes