Análisis de código fuente ORB-SLAM2 (monocular) - extracción de puntos característicos
Primero, convierta la imagen en una imagen en escala de grises.
2. Extraer características de la imagen
Si este cuadro de imagen es una imagen de inicialización, extraiga el doble de puntos característicos para la inicialización posterior
3. Constructor de monturas monoculares (Frame)
4. Lee los parámetros de la pirámide de imágenes.
Cinco, extracción de puntos característicos (ExtractORB)
El uso interno de funciones afines es similar a las llamadas a funciones.La
función de llamada específica:
El flujo de código de implementación específico:
(1) Construir una pirámide de imágenes (ComputePyramid)
1. Calcule el tamaño de cada capa de la imagen de la pirámide y el número de puntos característicos extraídos
2. Escale la imagen para que se convierta en el tamaño de imagen de la pirámide en este nivel
3. Rellene cada capa de la imagen de la pirámide (copyMakeBorder)
¿Por qué acolchado?
Debido a que usamos el método FAST para extraer los puntos característicos del ORB, necesitamos llenar el límite para que se puedan extraer los puntos de esquina de los puntos límite y, en la extracción posterior del descriptor, primero debemos realizar el desenfoque gaussiano en el image y luego extraiga el descriptor, por lo que la imagen también se llena,
(2) Los puntos característicos (ComputeKeyPointsOctTree) de la imagen extraída homogéneamente
son diferentes de los puntos característicos extraídos por Opencv. Los puntos característicos extraídos por Opencv se extraen de toda el área de la imagen, por lo que los puntos característicos extraídos pueden concentrarse en ciertas áreas. Y esperamos que cada área de la imagen tenga puntos característicos correspondientes, y que los puntos característicos uniformes puedan mejorar la precisión de nuestro cálculo de pose.
1. Divida cada capa de imagen piramidal en bloques, cada 30*30 en un bloque, y divida la imagen en muchos bloques
Luego realizamos la extracción de puntos de características en estos bloques en lugar de extraer toda la imagen
2. Calcular el área efectiva de extracción de características de la imagen, porque la imagen se llenó previamente
El llenado previo de la imagen es necesario para el llenado único del algoritmo subsiguiente, pero no necesitamos llenar tanto para la extracción de puntos característicos aquí, por lo que necesitamos interceptar algunas áreas de llenado no válidas y mantener el área de la imagen donde queremos. extraiga los puntos de las esquinas Después de obtener el área de extracción de puntos característicos efectivos, la imagen se divide en bloques y la imagen se divide en cuadrículas de bloques
3. Extraiga puntos característicos para cada bloque de cuadrícula de la imagen
4. Utilice el umbral de esquina predeterminado para extraer puntos de esquina. Si no se extraen puntos de esquina, baje el umbral para extraer
Transforme las coordenadas, debido a que los puntos característicos extraídos en la cuadrícula son relativos a la cuadrícula, necesitamos transformar el sistema de coordenadas en la imagen.
5. Use quadtree para filtrar puntos característicos (DistributeOctTree)
El número de características extraídas supera el umbral de puntos característicos que establecimos, por lo que debemos filtrar los puntos característicos. El quadtree divide la imagen en el número de puntos característicos que queremos extraer y selecciona uno de estas áreas divididas. Los mejores puntos característicos servir como representantes
6. Calcule los descriptores de los puntos característicos.
Cuente todos los puntos característicos y construya la matriz de descriptores de puntos característicos.
Desenfoque gaussiano de la imagen
El desenfoque gaussiano se realiza aquí para eliminar puntos de ruido en la imagen, mejorando así la precisión del descriptor, y no usamos el modo gaussiano antes de extraer los puntos característicos. Se debe a que el modo gaussiano eliminará la información de los bordes de la imagen, lo que afectará nuestra extracción de puntos característicos.
Calcule el descriptor del punto característico y asigne las coordenadas del punto característico extraídas de la pirámide de la imagen a la imagen original
6. Use la función de corrección de OpenCV y la referencia interna para corregir los puntos de características extraídos (UndistortKeyPoints)
Debido a la lente, la imagen que obtenemos estará distorsionada.
7. Calcule el límite de la imagen después de eliminar la distorsión (ComputeImageBounds)
Nuestra imagen estará distorsionada, por lo que debemos corregir la imagen. Después de que la imagen esté distorsionada, la imagen original tendrá un borde. Es necesario reposicionar las esquinas superior izquierda e inferior derecha de la imagen y reposicionar el borde de la imagen. .