Constellation Knowledge Network - Preguntas y respuestas sobre Bagua - Cómo llamar a la biblioteca openMVG en C++

Cómo llamar a la biblioteca openMVG en C++

Open MVG (Open Multiple View Geometry): una biblioteca de geometría sólida de vista múltiple de código abierto, que es una biblioteca de código abierto muy conocida para procesar geometría sólida de vista múltiple en cv. Cree en la simplicidad y la facilidad de mantenimiento y proporciona un potente conjunto de interfaces. Cada módulo se prueba y se esfuerza por brindar una experiencia consistente y confiable.

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

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.

上篇: Fotos del embarazo de Duke Zhou_Fotos del embarazo de Duke Zhou. 下篇: ¿Qué opinas sobre la adivinación?
Artículos populares