2016-07-12 4 views
0

J'ai plusieurs images d'un objet prises par le même appareil photo calibré. Disons que calibrated signifie à la fois les paramètres intrinsèques et extrinsèques (je peux mettre un damier à côté de l'objet, donc tous les paramètres peuvent être récupérés). Sur ces images, je peux trouver des points-clés correspondants en utilisant SIFT ou SURF, et un algorithme de correspondance, c'est OpenCV de base. Mais comment faire la reconstruction 3D de ces points à partir de plusieurs images? Ce n'est pas un arrangement stéréo classique, donc il y a plus de 2 images avec les mêmes points d'objet sur eux, et je veux en utiliser autant que possible pour une précision accrue.Calcul de coordonnées 3D de points-clés dans plusieurs images

Y a-t-il des fonctions OpenCV intégrées qui font cela?

(Notez que cela se fait hors ligne, la solution n'a pas besoin d'être rapide, mais robuste)

Répondre

0

Je pense que j'ai trouvé une solution pour cela. La structure des algorithmes de mouvement traite du cas où les caméras ne sont pas calibrées, mais dans ce cas tous les paramètres intrinsèques et extrinsèques sont connus.

Le problème se dégrade en un problème des moindres carrés linéaire:

Il faut calculer les coordonnées d'un point unique de l'objet:

X = [x, y, z, 1]' 
C = [x, y, z]' 
X = [[C], [1]] 

On donne n images, qui ont ces matrices de transformation :

Pi = Ki * [Ri|ti] 

Ces matrices sont déjà connues . Le point d'objet est projeté sur les images à

U = [ui, vi] 

On peut écrire en coordonnées homogènes (l'opérateur * représente à la fois la multiplication de la matrice, le produit scalaire et multiplication scalaire):

[ui * wi, vi * wi, wi]' = Pi * X 

Pi = [[p11i, p12i, p13i, p14i], 
     [p21i, p22i, p23i, p24i], 
     [p31i, p32i, p33i, p34i]] 

Définissons les éléments suivants:

p1i = [p11i, p12i, p13i] (the first row of Pi missing the last element) 
p2i = [p21i, p22i, p23i] (the second row of Pi missing the last element) 
p3i = [p31i, p32i, p33i] (the third row of Pi missing the last element) 

a1i = p14i 
a2i = p24i 
a3i = p34i 

Ensuite, nous pouvons écrire:

Q = [x, y, z] 
wi = p3i * Q + a3i 
ui = (p1i * Q + a1i)/wi = 
    = (p1i * Q + a1i)/(p3i * Q + a3i) 
ui * p3i * Q + ui * a3i - p1i * Q - a1i = 0 
(ui * p3i - p1i) * Q = a1i - a3i 

De même pour vi:

(vi * p3i - p2i) * Q = a2i - a3i 

Et cela vaut pour i = 1..n.Nous pouvons écrire ce sous forme matricielle:

G * Q = b 

G = [[u1 * p31 - p11], 
    [v1 * p31 - p21], 
    [u2 * p32 - p12], 
    [v2 * p32 - p22], 
    ...   
    [un * p3n - p1n], 
    [vn * p3n - p2n]] 

b = [[a11 - a31 * u1], 
    [a21 - a31 * v1], 
    [a12 - a32 * u2], 
    [a22 - a32 * v2], 
    ... 
    [a1n - a3n * un], 
    [a2n - a3n * vn]] 

Depuis G et b sont connus des Pi matrices, et les points d'image [ui, vi], on peut calculer la pseudo de G (appeler G_) et compute:

Q = G_ * b 
0

Je suppose que vous êtes à la recherche de soi-disant Structur from motion approches. Ils utilisent plusieurs images provenant de points de vue différents et renvoient une reconstruction 3D (par exemple, un nuage de points). Il semble que OpenCV ait un module SfM dans le paquet contrib, mais je n'ai aucune expérience avec lui. Toutefois, je travaillais avec bundler. C'était assez simple et renvoie l'ensemble des informations (étalonnage de la caméra et positions des points) sous forme de fichier texte et vous pouvez voir le nuage de points avec Meshlab. Veuillez noter qu'il utilise les points-clés et les descripteurs SIFT pour l'établissement de la correspondance.

+0

merci, je réussi à comprendre moi-même, mais votre réponse m'a été utile! – icguy

+0

vous êtes les bienvenus, mais généralement vous pouvez fournir des caméras intrinsèques pour les approches SfM pour améliorer le résultat (au moins bundler est capable de les estimer lui-même, mais en fonction de la quantité d'images le résultat était pire) ... SfM est plus facile pour vous que de mettre un damier à côté de votre objet (et de le placer de manière visible dans chaque image) ... – gfkri