Cómo llamar a la biblioteca openMVG en C++
Dirección: github
Documento: Documentación
OpenMVG puede:
Resolver el problema de la coincidencia precisa de geometría sólida de múltiples vistas;
Proporciona una serie de métodos de extracción y comparación de características necesarios para SfM;
Cadena completa de herramientas SfM (calibración, evaluación, reconstrucción, tratamiento de superficies, etc.). );
OpenMVG intenta proporcionar código legible para que los desarrolladores vuelvan a desarrollarlo, y las funciones principales son lo más simples posible, por lo que es posible que necesite otras bibliotecas para completar su sistema. OpenMVG se divide en varios módulos grandes:
Biblioteca principal: implementación del algoritmo central de cada función;
Ejemplo: enseñarle cómo usarla;
Cadena de herramientas : es decir, usar juntos (función de coincidencia de conjuntos de imágenes codificadas, SfM, procesamiento de color y textura);
Instalación #0 (win1VS2013)
Por supuesto, el primer paso. es descargarlo de github. Clonar el código en clone y seguir las instrucciones de BUILD. Cabe señalar que:
Plantilla & clase ltT & operador de prueba en línea gt (T x, T y) {
Devuelve static _ cast & ltT & gt(static _ cast) & ltint & gt(x) | static_cast<int & gt(y));
};
Se recomienda compilar con opencv. El método consiste en cambiar la opción correspondiente a activada en el archivo CMakeLists.txt y luego agregar una entrada denominada opencv_DIR en la GUI de cmake. El valor es la ruta a su OpenCV instalado.
OpenMVG está muy bien escrito y proporciona un buen soporte para Windows. Entonces, después de cmake, puede compilar la solución openMVG.sln generada abriéndola con VS, lo que llevará un poco más de tiempo. El VS2013 que estoy usando no es compatible con las nuevas funciones de C++: constexpr, por lo que te recomiendo que uses VS2015 o superior. Si debe usar VS2013, puede hacer esto: elimine directamente el lugar con constexpr en el archivo src/open mvg/camera/camera_common.HPP, o cámbielo.
Al ejecutar el ejemplo, encontré un problema aquí: la línea 86 de DenseStoraage.h informó un error: la aserción R6010 falló. Este es un error de aserción. No aparecerá en el modo de lanzamiento, pero casi aparece en. modo de depuración. La razón es que cuando abre el sitio web proporcionado por Eigen, puede ver claramente que la estructura de datos es una matriz no alineada. Este problema sigue siendo muy molesto para las personas nuevas en openMVG. El código openMVG es elegante. Muchos tipos de datos se extienden a partir de clases o funciones de plantilla. Varios métodos específicos se extienden a través de funciones virtuales. También depende en gran medida de la biblioteca Eigen, lo que dificulta los problemas de posicionamiento. Después de un día de arduo trabajo, finalmente determiné el motivo:
La clase Regiones definida en el archivo regiones.h contiene un vector contenedor stl de tamaño fijo de tipos de características vectorizables. Según la solución proporcionada por Eigen, lo que hay que hacer es:
//Inicialmente
typedef STD::vector & lt;FeatureT & gtFeatsT
//Cambiar para
typedef STD::vector & lt;FeatureT, Eigen::aligned _ allocator & lt;FeatureT & gt& gtFeatsT
//Es necesario cambiar otros lugares similares , incluida la función vectorial de retorno, es mejor agregar Eigen_make_aligned_operator_new.
#1. Biblioteca principal
#1.1 Imagen
#Contenedor de imágenes
OpenMVG proporciona una clase básica como contenedor de imágenes: imagen
//Imagen en escala de grises de 8 bits:
Imagen y carácter sin firmar & gt grayscale_image_ 8bit
//Imagen multicanal: (Utilice tipos de píxeles predefinidos )
//Imagen RGB de 8 bits:
Imagen & ltRGBColor & gtrgb _ imagen _ 8 bits
// Imagen RGBA de 8 bits
Imagen<RGBAColor>rgba_image_8bit
Imagen<Rgba<UnsignedCharacter>& gtrgba_image2_8bit
Aquí RGBColor y RGBAColor es un tipo definido por openMVG basado en Eigen, específicamente en pixel_types.hpp
#Entrada de imagen /salida
OpenMVG admite archivos de imagen en formatos ppm/PGM, JPEG, PNG y TIFF. Ejemplo:
Imagen<RGBColor>rgb_image_gray
bool bRet = ReadImage(" foo . img extension", & ampRGB_image);
#Operaciones de dibujo
Se utiliza para dibujar círculos, elipses, líneas rectas, etc. en la imagen.
Valor #1.2
OpenMVG vuelve a empaquetar los tipos y algoritmos básicos de Eigen para facilitar las llamadas. Por ejemplo, Vec2 representa un punto bidimensional (tipo char).
Función #1.3
Este módulo proporciona principalmente la encapsulación de contenedores de características, incluidas características, descripciones de características, conjuntos de puntos clave, etc. , básicamente todas las clases de plantilla. Por ejemplo, el descriptor de función SIFT superior podría hacer esto:
//SIFT like descriptor
descriptor typedef <float,128>siftDescriptorData
# 1.4 Camera p>
Este módulo proporciona clases abstractas para diferentes modelos de cámara, incluyendo:
#modelo de cámara estenopeica
El modelo de cámara más simple, como se muestra en la figura: Cámara El modelo incluye parámetros internos y parámetros externos Todo el mundo está familiarizado con las palabras clave: matriz de proyección, matriz de rotación y traslación, distancia focal, punto principal, etc. Ver descripción para más detalles. Mire un ejemplo: clase PinholeCamera proporcionada por openMVG:
///Cámara estenopeica P = K[R|t], t = -RC
Estructura de cámara estenopeica
{
//Constructor
Cámara estenopeica(
const Mat3 & ampK = Mat3::Identity(),
const Mat3 & ampR = Mat3::Identity(),
const Vec3 & ampt = Vec3::Zero())
:_K(K), _R(R ), _t (t)
{
_ C =-r . transpose()* t;
P_From_KRt(_K, _R, _t, & amp_ P);
}
Cámara estenopeica (const Mat34 y ampp)
{
_ P = P
KRt_From_P (_P, & amp_K, & amp_R, & amp_ t);
_ C =-_ r . transpose()* _ t; ///Matriz de proyección P = K[R|t]
mat 34 _ P;
///Parámetros intrínsecos (enfoque, punto principal)
mat 3_K;
///rotación externa
mat 3_R;
///transformación externa
ve C3_t;
///Centro de cámara
ve C3_C;
};
#1.5 más Ver geometría
Esta parte es uno de los módulos básicos e importantes, que incluye:
n(>=2) algoritmo para resolver la perspectiva;
——Kernel;, un marco general para combinar estos algoritmos para estimación robusta;
El documento explica los conceptos de matriz de homografía, matriz de características, matriz esencial y matriz de posición, lo cual es muy bueno. Se recomienda leer atentamente la documentación.
Una breve explicación:
Matriz de homografía: describe la relación entre dos planos de proyección;
Matriz de características: la relación entre la misma escena fotografiada por dos cámaras, es decir, dos La relación entre la posición de la imagen del punto A en el objeto bajo el ángulo de visión;
Matriz esencial: basándose en el establecimiento de la matriz intrínseca y la matriz de parámetros intrínsecos, describa la relación relativa entre la cámara y la posición de la matriz intrínseca ;
Matriz esencial: basada en el establecimiento de la matriz intrínseca y la matriz de parámetros intrínsecos;
p>
Matriz de posición: estima la posición absoluta de la cámara (convertida en una problema de minimización);
Kernel: una clase que combina solucionadores, datos, esquemas de medición, etc. , que se utilizará para estimar de forma sólida los parámetros y matrices anteriores;
#1.6 Programación lineal
Un conjunto de herramientas para resolver optimización lineal (estimación de parámetros) en geometrías de múltiples vistas, documentación.
#1.7 Estimación robusta
Proporciona una serie de métodos de estimación robustos, como máxima consistencia, máxima consistencia, AC-Ransac y Ransac inverso.
#1.7 Coincidencia
Las interfaces proporcionadas incluyen: NNS, K-NN, FLANN, KVLD, hash en cascada del vecino más cercano, etc. Estas interfaces están disponibles para conjuntos de puntos bidimensionales o tridimensionales y conjuntos de descripción de características de dimensiones superiores.
#1.8 Seguimiento
El seguimiento en geometría de múltiples vistas se refiere a encontrar puntos característicos correspondientes (posiciones del mismo punto en diferentes vistas) en una serie de imágenes.
#1.9 Pies Cuadrados
El módulo sfm proporcionado por openMVG contiene una serie de métodos e interfaces de almacenamiento de datos para tratar problemas de SfM, como estimación de la posición de la cámara, medición estructural, BA, etc. La clase SfM_Data contiene todas las entradas a SfM:
Estructura SfM_Data
{
///Vistas consideradas
Ver vista; Contiene el nombre del archivo de imagen, id_view, id_pose, id_intrinsic, tamaño de la imagen.
///Poses consideradas (indexadas por view.id_pose)
poses; //Posición 3D de la cámara
///Considerada como la cámara Intrínsecos intrínsecos//Referencia interna de la cámara
///Estructura (puntos 3D y sus observaciones 2D)
Estructura de referencia //Puntos 3D asociados con características de vista 2D
}
Aquí hay algunos ejemplos:
#1.features_siftPutativeMatches
Este ejemplo hace varias cosas (traducido directamente al oficial):
Extraiga las características SIFT de dos imágenes (usando vlsift no gratuito) y forme una descripción de la característica;
Según El descriptor de características coincide con los puntos de características en las dos imágenes (potente método L2); >
Mostrar los resultados coincidentes;
Al principio, encontrará un error de aserción. Consulte la sección anterior para conocer el método de procesamiento. Se generarán tres archivos en el directorio del proyecto exitoso: 00_images.jpg, 01_features.jpg, 02_siftMatches.svg
#2. Feature_affine_demo
Este ejemplo es de una imagen Ejemplos de MSER ( referencia) y extracción de características TBMR. MSER (Región Extrema Máxima Estable) es una transformación afín que es invariante a la escala de grises de la imagen, razón por la cual se nombra este ejemplo. El algoritmo de TBMR (Región Morse basada en árboles) no se comprende particularmente, pero se puede encontrar en Google Scholar.
#3. Feature_Image_Matching
Este ejemplo proporciona un ejemplo del uso de la interfaz Image_describer para extraer descriptores de características y hacer coincidir los resultados mostrados. En el ejemplo, puede elegir el algoritmo SIFT, AKAZE_MLDB o AKAZE. Aquí puede ver la introducción de AKAZE, que es un algoritmo de detección de características más estable que SIFT. La parte sobre el análisis de los parámetros de entrada en el programa se puede comentar (si ha utilizado la depuración VS2013) y puede modificar directamente el valor de sImage_describer_type_Type para realizar pruebas.
#4. Feature_kvld_filter y feature_repeatability
Estos dos también tratan sobre la extracción y coincidencia de características. En este ejemplo de kvld, debido a que el contenido en regiones.h se cambió antes, algunas interfaces de funciones también deben cambiarse en consecuencia. Específicamente, la opción de función de alineación se agrega al vector.
# 5. Multi-view_robust_homology_guided y multi-view_robust_basic_guided
Estos dos ejemplos estiman la matriz de homografía y la matriz propia, que pueden Los puntos coincidentes se determinan secuencialmente en función de esta información. Estas dos muestras se ejecutaron durante mucho tiempo (cuando la resolución era demasiado alta). El primero encontró un error al usar otra foto, probablemente un perro, así que no entraré en detalles...
#6.exif _Analysis
Extracción de información EXIF, compilada y ejecutado a través de la línea de comando.
El formato de parámetro dado es: - imafile, ruta a su foto, use / barra diagonal en la ruta.
Otro artículo: Aprendizaje de la instalación e introducción de openMVG
#7. Multi-View_Robust_Basic
Estime la matriz esencial y calcule la estructura 3D. Este ejemplo se puede ejecutar directamente y la nube de puntos generada es muy escasa y no tiene información de color.