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.
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