Analyse du code source ORB-SLAM2 (monoculaire) - initialisation de la carte monoculaire

Analyse du code source ORB-SLAM2 (monoculaire) - initialisation de la carte monoculaire

1. Initialisation monoculaire

L'initialisation de la carte monoculaire est différente de celle des caméras RGBD et binoculaires. Le processus d'initialisation de la carte monoculaire prendra beaucoup de temps. La raison en est que la carte monoculaire ne peut pas obtenir directement la profondeur comme les caméras RGBD et binoculaires, afin de construire une carte points. Le monoculaire doit faire correspondre les points caractéristiques entre deux cadres, puis utiliser la triangulation pour construire des points cartographiques, de sorte que le monoculaire a certaines exigences pour les deux cadres initiaux afin de garantir que suffisamment de points caractéristiques peuvent être extraits, et la distance entre les deux cadres Il y a suffisamment de correspondances entre eux, de sorte que les points de la carte peuvent être construits par triangulation

insérez la description de l'image ici

2. Les points caractéristiques des deux trames initialisées doivent être supérieurs à un certain seuil

insérez la description de l'image ici

Les points caractéristiques extraits du cadre d'initialisation doivent être supérieurs au seuil défini, de sorte qu'un nombre suffisant de points correspondants puissent être mis en correspondance pour une correspondance ultérieure des caractéristiques.

3. Effectuez la correspondance des caractéristiques entre les deux cadres initialisés, et le point de correspondance doit être supérieur à un certain seuil

insérez la description de l'image ici

Suffisamment de points d'appariement d'entités sont destinés à la triangulation ultérieure, et suffisamment de points de carte peuvent être générés pour initialiser la carte

4. Initialiser la fonction de correspondance des points caractéristiques entre les cadres (SearchForInitialization)

insérez la description de l'image ici

Appelez cette fonction, entrez le cadre de référence initialisé et le cadre actuel, la fenêtre de recherche pour la recherche de reprojection. Renvoie les informations d'appariement du point caractéristique correspondant et le point d'appariement.
Le code spécifique est implémenté comme suit :

(1) Construire un histogramme de rotation

insérez la description de l'image ici

Afin de filtrer les points de fonction de rotation non traditionnels dans l'histogramme, car lorsque l'image est tournée, les points de pixel globaux seront tournés dans une direction uniforme d'un certain angle, nous devons donc supprimer les angles de rotation qui ne sont pas dans le sens grand public.
(2) Parcourez les points caractéristiques du cadre de référence, recherchez la fenêtre de rayon dans le cadre actuel et recherchez les points caractéristiques candidats (GetFeaturesInArea)
insérez la description de l'image ici

La méthode d'appariement violent n'est pas utilisée ici, car la méthode d'appariement violent prend trop de temps. Les coordonnées des points caractéristiques du cadre de référence sont directement entrées ici car le mouvement entre les deux cadres est relativement faible, de sorte que les changements entre les images ne seront pas très différents, et la matrice de transformation entre le cadre actuel et le cadre de référence est inconnue, et le suivi est généralement Les coordonnées projetées sur l'image actuelle sont entrées via la matrice de transformation, de sorte que les points caractéristiques de l'image de référence sont utilisés comme coordonnées pour dessiner un cercle sur l'image actuelle, et les points candidats correspondants correspondants sont sélectionné dans le cercle.
insérez la description de l'image ici

L'implémentation interne de GetFeaturesInArea est la suivante :
1) Calculez la plage de recherche de points caractéristiques :
insérez la description de l'image ici
insérez la description de l'image ici

Divisez l'image en grilles, prenez les coordonnées des points caractéristiques du cadre de référence comme centre du cercle dans le cadre actuel, et connectez un carré avec un rayon de r, et obtenez les points caractéristiques dans le carré comme points correspondants candidats 2) Obtenez les points caractéristiques du cercle en tant que
candidats
insérez la description de l'image ici

(3) Obtenir le descripteur de point caractéristique du cadre de référence, calculer la distance avec le descripteur du point caractéristique candidat précédemment trouvé et filtrer le meilleur point correspondant et le deuxième meilleur point correspondant
insérez la description de l'image ici

Filtrer les points caractéristiques candidats par distance de Hamming, sélectionner le meilleur point caractéristique et le deuxième meilleur point caractéristique
(4) Vérifier le meilleur point correspondant filtré et la deuxième meilleure paire correspondante
insérez la description de l'image ici

Même si l'on calcule la distance du meilleur descripteur, cette distance doit être inférieure à un certain seuil.
La distance optimale est inférieure au rapport défini par rapport à la deuxième distance optimale, de sorte que la reconnaissance des points caractéristiques est supérieure.
Si les points caractéristiques candidats trouvés ont été mis en correspondance auparavant, cela signifie qu'une mise en correspondance répétée s'est produite et que la correspondance d'origine est également supprimée
(5) Filtrez la partie "non courante" dans l'histogramme de rotation

insérez la description de l'image ici

5. Obtenez les poses relatives des deux cadres initiaux et obtenez les points de carte initiaux par triangulation (Initialize)

insérez la description de l'image ici
insérez la description de l'image ici

Calculez la pose de la caméra actuelle grâce aux informations de correspondance des points de diagnostic spéciaux obtenus ci-dessus et générez les points de carte initiaux par triangulation. L'
implémentation spécifique du code est la suivante :
(1) Réenregistrez la relation de correspondance de l'entité paires de points
insérez la description de l'image ici

(2) Selon le nombre d'itérations RANSAC, sélectionner au hasard huit paires de points correspondants pour chaque itération
insérez la description de l'image ici

Nous utiliserons la méthode des huit points pour calculer la matrice d'homographie et la matrice fondamentale, et utiliserons la matrice avec un score élevé pour restaurer la pose de la caméra. Ainsi, chaque itération utilise huit paires de points différentes pour calculer la matrice de score élevé
(3) À travers huit paires correspondantes, calculez le score de la matrice d'homographie (H) et de la matrice fondamentale (F)
insérez la description de l'image ici

Ouvrez deux threads, calculez la matrice d'homographie (H) et la matrice fondamentale (F) en même temps, obtenez les scores des deux matrices, puis jugez quelle matrice utiliser pour initialiser la pose en comparant les scores.
(4) Selon le score calculé de la matrice d'homographie et de la matrice de base, déterminer quelle matrice est utilisée pour initialiser la pose
insérez la description de l'image ici

Un score plus élevé de la matrice d'homographie indique que l'image du cadre d'initialisation est biaisée vers le plan, et
un score plus élevé de la matrice fondamentale indique que l'image du cadre d'initialisation est biaisée vers le non plan.
(5) Utiliser la pose obtenue par la matrice d'homographie (H), et initialiser le point de carte (ReconstructH)
insérez la description de l'image ici

Peut calculer 8 groupes de solutions, nous vérifions ces 8 groupes et sélectionnons la solution qui génère le plus de points 3D devant la caméra comme solution optimale (vérifiez via la fonction CheckRT pour générer des points 3D) (6) Utilisez la matrice fondamentale (F) pour
trouver la pose et initialiser le point de la carte (ReconstruireF)
insérez la description de l'image ici

Résolvez deux solutions R et deux solutions t à partir de la matrice essentielle, un total de quatre ensembles de solutions
pour vérifier les quatre combinaisons de R et t, et sélectionnez la meilleure combinaison. Si une certaine combinaison fait le point 3D récupéré devant la caméra Le nombre est le plus grand, alors cette combinaison est la meilleure combinaison (vérifiée par la fonction CheckRT)
(7) Trianguler les points correspondants entre la pose obtenue (R, T) et le cadre d'initialisation, et obtenir le point intérieur (CheckRT)
insérez la description de l'image ici

Pour la paire de points caractéristiques donnée et son R t , vérifiez la validité de la solution par triangulation, également connue sous le nom de vérification de cheiralité
1. Calculez et initialisez la matrice de projection entre deux images :
insérez la description de l'image ici

Lorsque la carte est initialisée, nous utiliserons la première image de l'image d'initialisation comme système de coordonnées mondial, avec le centre optique de la caméra comme origine.
2. Parcourez tous les points correspondants, triangulez à travers la matrice de projection et obtenez les points 3D après la triangulation
insérez la description de l'image ici

3. Vérifiez si les coordonnées triangulées des points 3D sont légales (pas infinies)
insérez la description de l'image ici

4. Vérifiez s'il est légal à travers le positif et le négatif de la valeur de profondeur du point 3D et de l'angle de parallaxe du centre optique des deux caméras
insérez la description de l'image ici

5. Calculer l'erreur de reprojection du point spatial sur le référentiel et le référentiel courant, et l'écarter si elle est supérieure au seuil
insérez la description de l'image ici

Le point 3D calculé est projeté sur les coordonnées du pixel à travers la pose R, T et les paramètres internes de la caméra, et l'erreur de reprojection est calculée avec les coordonnées du point caractéristique sur l'image. L'erreur ne peut pas dépasser notre seuil. Nous appelons les points qui ne dépassent pas la valeur seuil points internes, et les points qui dépassent la valeur seuil sont appelés points externes
6. Compter le nombre de points 3D testés et enregistrer l'angle de parallaxe des points 3D
insérez la description de l'image ici

7. Obtenez le plus petit angle de parallaxe dans le point 3D et convertissez-le en une représentation du système d'angle
insérez la description de l'image ici

(8) Enregistrer les informations de pose du cadre d'initialisation
insérez la description de l'image ici

(9) Initialiser les points de la carte (CreateInitialMapMonocular)
insérez la description de l'image ici

Le code est implémenté comme suit :
1. La valeur de référence initialisée et l'image courante sont des images clés, initialisez ces deux images clés, et insérez-les dans la carte
insérez la description de l'image ici

2. Utiliser les points 3D obtenus par triangulation pour générer des points cartographiques MapPoints
insérez la description de l'image ici

3. Mettre à jour la relation de connexion entre les images clés
insérez la description de l'image ici

Créez un bord entre le point de la carte et l'image clé, chaque bord a un poids, et le poids du bord est le nombre de points 3D communs entre l'image clé et l'image actuelle 4. Optimisation BA globale, optimiser toutes les poses et 3D points en même
temps
insérez la description de l'image ici

5. Prenez la profondeur médiane de la scène pour la normalisation de l'échelle
insérez la description de l'image ici

6. Normaliser la transformation entre deux cadres à une échelle de profondeur moyenne 1
insérez la description de l'image ici

7. Normaliser l'échelle des points 3D à 1
insérez la description de l'image ici

8. Insérez l'image clé dans la carte locale et mettez à jour la pose normalisée et les points de la carte locale

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43391596/article/details/129692273
conseillé
Classement