[PYTHON] [Computer Vision] Géométrie épipolaire apprise avec des chats

image

introduction

Le chat est mignon ~

Dans cet article, nous allons apprendre avec les chats ** la technologie pour restaurer le monde 3D à partir d'images multi-vues, qui est traitée dans le domaine de la vision par ordinateur **.

Ce domaine est encore à l'étude, et des formules parfois difficiles sortent, mais j'espère que la douleur sera neutralisée en apprenant avec les chats.

Cet article correspond au chapitre 5, "5.1 Géométrie épipolaire, 5.2 Calculs à l'aide de caméras et de structures 3D" dans "Practical Computer Vision" Faire.

Je souhaite restaurer le monde 3D à partir d'une image à vues multiples

L'image du chat au début était une image en deux dimensions. Alors, comment restaurer la forme tridimensionnelle de ce chat?

La bonne réponse est ** de photographier à partir de plusieurs perspectives tout en déplaçant la caméra vers le chat **.

En fonction de l'apparence du chat de chaque point de vue, le changement de posture de la caméra et la structure géométrique du chat que la caméra prend en photo sont calculés à nouveau.

Cela s'appelle Structure from Motion (SfM).

sfm_neko.png

La procédure est la suivante.

Pour simplifier le problème, considérez ici les paires d'images. En d'autres termes, considérez seulement deux points de vue.

Tout d'abord, je vais expliquer la théorie de base qui se produit entre ces images. Après cela, nous évaluerons le mouvement de la caméra et reconstruirons la scène 3D. L'optimisation globale de 4. est un processus qui n'est nécessaire que lorsqu'il y a beaucoup de points de vue, nous ne l'envisagerons donc pas ici.

La géométrie épipolaire est quoi?

Avant de déplacer la caméra ou de restaurer une scène 3D à partir d'une image à deux vues, il est nécessaire de comprendre la théorie de base de la géométrie épipolaire. La géométrie épipolaire est la géométrie qui se produit lorsque deux caméras capturent le même objet tridimensionnel à partir de perspectives différentes.

Les éléments qui systématisent la géométrie épipolaire sont le plan épipolaire, les lignes épipolaires, les épipoles, la matrice de base et la matrice de base, que nous présenterons ensuite.

Cinq mots super importants qui apparaissent dans la géométrie épipolaire

epipolar_geometry.png

Points correspondants et lignes épipolaires dessinés sur l'image réelle: image

Matrice de base F

Apparition de la cérémonie de contention épipolaire

Si $ x_ {1} $ et $ x_ {2} $ sont des points de correspondance, la relation suivante est valable pour tous les points de correspondance $ x_ {1} $, $ x_ {2} $.

\boldsymbol{x_{2}^{T}}F\boldsymbol{x_{1}} = 0

$ F $ s'appelle la matrice de base et est une matrice 3x3. $ x_ {1} $, $ x_ {2} $ sont des vecteurs tridimensionnels qui représentent les coordonnées des points correspondants dans le ** système de coordonnées d'image dans le système de coordonnées simultanées.

Cette formule montre qu'il existe une relation de contrainte entre les points correspondants des deux images. ** Cette formule est appelée formule de contention épipolaire. ** Une fois le point de vue décidé, il sera décidé (= contrainte) de quel côté dans l'image 2 se trouve le point correspondant trouvé dans l'image 1. Et cette formule de contrainte ne dépend que de ** 2 points de vue et pas du tout de la scène 3D. ** **

F.png

Maintenant, vérifions si $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ tient.

Puisque $ x_ {1} $ est un point sur l'image 1, il est exprimé comme $ x_ {1} = (x_ {1}, y_ {1}, z_ {1}) ^ {T} $ ($ z_ {1) } $ Est 1).

D'autre part, puisque F est une matrice 3x3, $ Fx_ {1} $, qui est le produit de $ x_ {1} $, est un vecteur tridimensionnel. Soit ce vecteur $ Fx_ {1} = (a, b, c) ^ T $.

Ce $ Fx_ {1} = (a, b, c) ^ T $ est le coefficient de la ligne épipolaire sur l'image 2. Ensuite, multiplier ce coefficient par x2 sur la ligne épipolaire montre que l'équation linéaire $ ax + par + c = 0 $ est satisfaite. En d'autres termes, $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ tient!

Inversement, si le résultat de la substitution de $ x_ {2} $ n'est pas 0, alors on peut dire que ce point $ x_ {2} $ ne correspond pas à x1 (voir la figure ci-dessous).

point_to_line_by_F.png

Lors de la recherche du point correspondant $ x_ {2} $ dans l'image 2 du point $ x_ {1} $ dans l'image 1, au lieu de rechercher l'image entière dans ** image 2, $ x_ {1} $ Seule la ligne épipolaire $ l_ {2} $ projetée sur l'image 2 doit être recherchée **, de sorte que le coût du calcul et le taux de réponse aux erreurs diminuent.

À propos, l'équation ci-dessus $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ mappe le point $ x_ {1} $ de l'image 1 sur l'image 2 sous forme de ligne droite. Cela représente le cas. Au contraire, lorsque le point $ x_ {2} $ sur l'image 2 est mappé sur l'image 1 sous forme de ligne droite, l'équation suivante est obtenue et les deux côtés sont transposés, donc c'est mathématiquement le même. ($ (\ Boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}}) ^ {T} = $ La formule suivante)

\boldsymbol{x_{1}^{T}}F^{T}\boldsymbol{x_{2}} = 0

Le fait est que les positions de $ x_ {1} $ et $ x_ {2} $ sont permutées et F est transposée.

point_to_line_by_F_inv.png

1. Trouvez F

Alors, comment trouvez-vous F? Il existe plusieurs méthodes typiques pour cela.

De plus, si les deux matrices de caméras sont connues, vous pouvez également les trouver Implémentation

Algorithme en 8 points

Voici un aperçu de l'algorithme en 8 points le plus basique (voir le lien ci-dessus pour une implémentation détaillée).

L'expression de contrainte épipolaire $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ donne une équation pour chaque point de correspondance i:

F_mat.png

Puisque la variable inconnue est ici une matrice F, nous résumerons F et résoudrons pour f sous la forme de l'équation Af = 0. Ici, F est une matrice 3x3, mais comme l'échelle est indéfinie, elle peut être résolue s'il y a pratiquement 8 points correspondants. Le nom de "l'algorithme en 8 points" vient d'ici.

8point_al.png

Après le démontage avec SVD, utilisez que F est le rang 2. Si la singularité minimale de la composante diagonale de Σ est fixée à 0 et résolue, la précision de F augmentera. Le côté gauche de la figure ci-dessous est le cas où la contrainte de rang 2 n'est pas appliquée, et le côté droit est le cas où la contrainte de rang 2 est appliquée.

F_singular_correct.png Cité de la référence [1].

2. Trouvez la matrice de caméra à partir de F

Alors pourquoi avons-nous trouvé F? Parce que nous pouvons trouver la matrice de caméra P à partir de ** F **.

Comme mentionné précédemment, F contient une matrice de caméra interne et une matrice de caméra externe. Par conséquent, si F est décomposé en matrices de caméra interne et externe, la matrice de caméra peut être estimée à partir de F.

Cependant, la précision de l'estimation dépend du fait que la caméra a été calibrée à l'avance ou non. Si les paramètres internes de la caméra sont inconnus, seule la transformation de projection peut être estimée à partir de F.

Le déroulement du processus de F à l'estimation de la matrice de la caméra est illustré dans la figure ci-dessous.

F_to_cam_summary.png

Si la caméra n'est pas calibrée

Si la caméra n'est pas étalonnée, c'est-à-dire si les paramètres internes de la caméra sont inconnus, les paramètres internes et externes de la caméra doivent être estimés. Dans ce cas, ** la matrice de la caméra ne peut être estimée que jusqu'à la transformation de projection. ** **

Normalement, vous pouvez trouver P de F dans un, mais ** au contraire, vous ne pouvez pas trouver P de F dans un **. En effet, les matrices de base des deux ensembles d'images projetées sont les mêmes.

Par exemple, F dans la matrice de caméra (P, P'H) et F dans la matrice de caméra (PH, P'H) sont identiques.

La matrice de caméra $ P_ {1} $, $ P_ {2} $ est la suivante. × est le produit extérieur.

P_{1}=[I|0]Et P_{2} =[[e_{2}]×F|e_{2}]

Si la caméra a été calibrée

Si la caméra a été calibrée, il vous suffit d'estimer les paramètres externes de la caméra. Tous les paramètres peuvent être estimés à l'exception de l'échelle de translation. F a l'ambiguïté de la transformation de projection, tandis que E a l'ambiguïté d'avoir quatre solutions.

Tout d'abord, trouvez la matrice de base E à partir de F en utilisant $ E = K_ {2} FK_ {1} $. Ensuite, décomposez E avec SVD. Puisque E a det (E) = 0 et que les valeurs singulières autres que 0 sont égales et que leurs grandeurs sont indéfinies, la composante diagonale de Σ peut s'écrire (1,1,0). En d'autres termes, il peut être décomposé par SVD comme suit.

E=Udiag(1,1,0)V^{T}

$ u_ {3} $ est le vecteur de la troisième colonne de $ U $

W = \begin{pmatrix}
0 & -1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 1 
\end{pmatrix}

Puis, à la fin, les quatre solutions suivantes apparaîtront dans la matrice de la caméra.

スクリーンショット 2016-02-24 6.50.49.png

Parmi ceux-ci, un seul a la scène devant la caméra, donc (a) est la bonne solution. (Figure ci-dessous)

スクリーンショット 2016-02-23 17.12.44.png

Cité de la référence [1].

3. Reconstruisez le monde 3D

La matrice de caméra P a été obtenue. Reconstruisons enfin le monde tridimensionnel.

Levé triangulaire

L'enquête triangulaire estime X qui satisfait simultanément les formules de conversion de caméra suivantes obtenues à partir de deux points de vue.

スクリーンショット 2016-02-23 10.04.12.png

Cité de la référence [1].

À partir de la formule de conversion de la caméra où la matrice de la caméra est $ P_ {1} $, $ P_ {2} $

\lambda_{1}x_{1} = P_{1}X
\lambda_{2}x_{2} = P_{2}X

Donc, si vous l'exprimez dans une matrice,

\begin{bmatrix}
P_{1} & -x_{1} & 0 \\
P_{2} & 0 & -x_{2} 
\end{bmatrix}
\begin{bmatrix}
X \\
\lambda_{1}\\
\lambda_{2} 
\end{bmatrix}
=0

Ce sera.

Comme il est également sous la forme Ax = 0, 3D X peut être restauré en résolvant x avec SVD.

la mise en oeuvre

Matériel de référence

Recommended Posts

[Computer Vision] Géométrie épipolaire apprise avec des chats
Apprenez à coloriser les images monochromes avec Chainer
Se préparer à apprendre les indicateurs techniques avec TFlearn
Ouvrez AI Gym pour apprendre avec le poteau de chariot contrôlé par PD
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
Apprenez à reconnaître les nombres manuscrits (MNIST) avec Caffe
AWS Step Functions pour apprendre avec un exemple
Comment entraîner Kaldi avec JUST Corpus
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
De l'achat d'un ordinateur à l'exécution d'un programme sur python
Résumé du site pour apprendre l'apprentissage automatique avec une vidéo en anglais
Comment apprendre le SVM structuré de ChainCRF avec PyStruct
[Comment!] Apprenez et jouez à Super Mario avec Tensorflow !!
MVC - Édition de modèle pour apprendre de 0 avec un biais uniquement
Je veux faire fonctionner un ordinateur quantique avec Python
Extraction de texte (API de lecture) avec l'API Azure Computer Vision (Python3.6)