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
2. Les points caractéristiques des deux trames initialisées doivent être supérieurs à un certain seuil
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
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)
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
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)
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.
L'implémentation interne de GetFeaturesInArea est la suivante :
1) Calculez la plage de recherche de points caractéristiques :
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
(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
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
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
5. Obtenez les poses relatives des deux cadres initiaux et obtenez les points de carte initiaux par triangulation (Initialize)
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
(2) Selon le nombre d'itérations RANSAC, sélectionner au hasard huit paires de points correspondants pour chaque itération
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)
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
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)
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)
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)
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 :
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
3. Vérifiez si les coordonnées triangulées des points 3D sont légales (pas infinies)
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
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
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
7. Obtenez le plus petit angle de parallaxe dans le point 3D et convertissez-le en une représentation du système d'angle
(8) Enregistrer les informations de pose du cadre d'initialisation
(9) Initialiser les points de la carte (CreateInitialMapMonocular)
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
2. Utiliser les points 3D obtenus par triangulation pour générer des points cartographiques MapPoints
3. Mettre à jour la relation de connexion entre les images clés
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
5. Prenez la profondeur médiane de la scène pour la normalisation de l'échelle
6. Normaliser la transformation entre deux cadres à une échelle de profondeur moyenne 1
7. Normaliser l'échelle des points 3D à 1
8. Insérez l'image clé dans la carte locale et mettez à jour la pose normalisée et les points de la carte locale