¿Cómo utilizar la biblioteca openmVG?
Dirección: github
Documentos: documentos
openMVG puede:
Resolver el problema de la coincidencia precisa de geometría estéreo de múltiples vistas;
Proporciona una serie de métodos de extracción y comparación de características necesarios en SfM;
Cadena completa de herramientas SfM (calibración, estimación de parámetros, reconstrucción, tratamiento de superficies, etc.);
Proporciona una serie de métodos de extracción y comparación de características necesarios en SfM.
Herramientas SfM completas (corrección, estimación de parámetros, reconstrucción, revestimiento, etc.).
Herramientas SfM completas (corrección, evaluación, reconstrucción, revestimiento, etc.).
Herramientas SfM completas (corrección, evaluación, reconstrucción, tratamiento de superficies, etc.);
openMVG proporciona código legible tanto como sea posible para facilitar a los desarrolladores el desarrollo secundario. openMVG se divide en varios módulos:
Biblioteca central: el algoritmo central de cada función;
Ejemplo: muestra cómo utilizarla;
Cadena de herramientas: es decir , vinculado en Together (función de coincidencia de conjuntos de imágenes desordenadas, SfM, procesamiento de color y textura);
Instalación #0 (Win10 VS2013)
El primer paso es, por supuesto, clonar. el código de github, luego siga las instrucciones de CONSTRUCCIÓN. plantilla lt; clase Tgt; operador T en línea|(T x, T y){
return static_castlt;Tgt; (static_castlt;intgt;(x) | static_castlt;intgt;(y)); p> p>
};
Se recomienda utilizar opencv para la compilación cambiando la opción correspondiente en el archivo CMakeLists.txt a ON y luego agregando una nueva opción. txt en ON y luego agregue una entrada llamada OpenCV_DIR en la interfaz gráfica de usuario de cmake, cuyo valor es la ruta a su opencv.
openMVG está bien escrito y tiene buen soporte para Windows, por lo que después de cmake, puede abrir la solución openMVG.sln generada con VS para su compilación, lo que lleva un poco de tiempo. El VS2013 que estoy usando no es compatible con la nueva característica de C: constexpr, por lo que le recomiendo que use VS2015 o una versión más reciente. Si debe usar VS2013, puede hacer esto: Habrá constexpr en src/openMVG/cameras/Camera_Common. archivo hpp También puede eliminarlo directamente o usar una función de plantilla en su lugar:
Al ejecutar el ejemplo, encontré una trampa: Error en la línea 86 de DenseStoraage.h: R6010 Error de aserción. Este es un error de aserción. Esto no sucederá en el modo de lanzamiento, pero es casi seguro que sucederá en el modo de depuración. El motivo queda claro en la URL proporcionada por Eigen: la estructura de datos está desalineada (matriz no alineada). El código openMVG es muy elegante. Muchos tipos de datos se extienden a partir de clases o funciones de plantilla. Los métodos específicos se extienden a través de funciones virtuales. Dependen en gran medida de la biblioteca Eigen, lo que genera obstáculos para la localización del problema.
Después de un día de investigación, finalmente encontré el motivo:
La clase Regiones está definida en el archivo de regiones. Según la solución proporcionada por Eigen, solo necesita:
//. Original
typedef std::vectorlt;FeatureTgt;FeatsT;
/ Cambiar a
typedef std::vectorlt;FeatureT, Eigen::aligned_allocatorlt.FeatureTgt; gt;FeatsT;
p>//Todo como esto debería cambiarse, incluidas las funciones que devuelven vectores, preferiblemente agregando también EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#1. Biblioteca principal
#1.1 Imagen
#1.1 Contenedor de imágenes
#1 Contenedor de imágenes
openMVG proporciona una clase básica que se puede utilizar como contenedor de imágenes: Imagelt; Tgt;, donde T representa el tipo de píxel, que puede manejar imágenes en escala de grises, RGB, RGBA o de tipo personalizado. El uso es muy simple:
// Imagen en escala de grises de 8 bits:
Imagelt; unsigned chargt; grayscale_image_8bit;// Imagen multicanal: ( Usar tipo de píxel preestablecido definido)
// Imagen RGB de 8 bits:
Imagelt; rgb_image_8bit
// Imagen RGBA de 8 bits
p>Imagelt; RGBAColorgt.rgba_image_8bit;
Image lt; unsigned chargt; rgba_image2_8bit; aquí, RGBColor, RGBAColor, etc. basado en Eigen. Están definidos en pixel_types.hpp.
#Image I/O
openMVG admite archivos de imagen en formatos ppm/pgm, jpeg, png y tiff, como:
Imagelt; rgb_image_gray;
bool bRet = ReadImage("Foo.imgExtension", amp; rgb_image);
#Operaciones de dibujo
Se utiliza para dibujar círculos, elipses, rectas. líneas, etc.
#1.2 Valores numéricos
openMVG vuelve a empaquetar los tipos y algoritmos básicos de Eigen para llamadas más simples. Por ejemplo, Vec2 representa un punto bidimensional (tipo char).
#1.3 Funciones
Este módulo proporciona principalmente la encapsulación de contenedores de funciones, incluidas funciones, descripciones de funciones, conjuntos de puntos clave, etc.
// Similar a SIFT Descriptor
typedef Descriptorlt; float, 128gt; siftDescriptorData;
#1.4 Cámara
Este módulo proporciona clases abstractas para diferentes modelos de cámara, que incluyen:
p>#Modelo de cámara estenopeica
El modelo de cámara más simple, como se muestra en la figura: El modelo de cámara incluye parámetros internos y externos. Las palabras clave nos son familiares: matriz de proyección, matriz de rotación y traslación, distancia focal, punto principal, etc. Ver instrucciones.
Consulte el ejemplo: openMVG proporciona la clase de cámara estenopeica:
// Cámara estenopeica P = K[R|t], t = -RC
struct PinholeCamera
{
//Constructor
PinholeCamera(
const Mat3 amp; K = Mat3::Identity(),
const Mat3 & R = Mat3::Identidad(),
const Vec3 & t = Vec3::Zero())
:_K(K), _R(R ), _t( t)
{
_C = -R.transpose() * t;
P_From_KRt(_K, _R, _t, amp; _P ); p>
}
Cámara estenopeica(const Mat34 y P)
{
_P = P;
KRt_From_P(_P , amp; _K, amp; _R, amp; _t);
_C = -_R.transpose() * _t; matriz P = K[R|t]
Mat34 _P
// Parámetro intrínseco (Focal, punto principal)
Mat3 _K
//Rotación extrínseca
Mat3 _R;
//Traducción extrínseca
Vec3 _t
//Centro de cámara
Vec3 _C;
};
#1.5 Geometría multivista
Este es uno de los módulos más básico e importante, que incluye:
Algoritmo de solución para n(gt;=2) vistas en geometría de conjuntos de vistas múltiples;
El núcleo es un marco general para sintetizar estas soluciones. Algoritmos para realizar una estimación robusta;
La documentación explica conceptos como matrices de respuesta única, matrices de características, matrices propias, matrices de posición, etc. Está muy bien presentado y recomiendo leer el documento con atención. Una breve explicación:
Matriz de respuesta única: 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, de La relación entre las posiciones del punto A en objetos fotografiados desde dos ángulos de visión;
Matriz propia: basada en la matriz característica y la matriz de referencia interna, describe la relación relativa entre la cámara y la posición de la matriz característica .
Matriz de posición: estima la posición absoluta de la cámara (convirtiéndola en un problema de minimización que necesita ser resuelto);
Kernel: combina solucionadores, datos, esquemas de medición, etc. amable. Esta clase se utilizará para estimar de forma sólida los parámetros y matrices anteriores;
#1.6 Programación lineal
Herramientas para resolver problemas de optimización lineal (estimación de parámetros) en geometría de múltiples vistas.
#1.7 Estimación robusta
Proporciona una serie de métodos de estimación robustos, como Max-Consensus, Max-Consensus, AC-Ransac A Contrario Ransac, etc.
Coincidencia #1.7
Proporciona NNS, K-NN, FLANN, KVLD, hash en cascada del vecino más cercano y otras interfaces. Estas interfaces se pueden utilizar para conjuntos de puntos bidimensionales o tridimensionales, así como para conjuntos de descripción de características de dimensiones superiores.
#1.8 Seguimiento
El seguimiento en geometría de múltiples vistas es el proceso de encontrar puntos característicos correspondientes (posiciones del mismo punto en diferentes vistas) en una serie de imágenes.
#1.9 sfm
El módulo sfm proporcionado por openMVG contiene una serie de métodos e interfaces de almacenamiento de datos para manejar problemas de SfM, como estimación de la posición de la cámara, medición de estructuras, BA, etc. La clase SfM_Data contiene un conjunto de interfaces de almacenamiento de datos que manejan problemas de SfM. La clase SfM_Data contiene todas las entradas a SfM:
struct SfM_Data
{
// Vistas consideradas
Vistas vistas // Contiene Nombre del archivo de imagen, id_view, id_pose, id_intrinsic, nombre del archivo de imagen, intrínseco, tamaño de la imagen. id_pose)
Poses poses; // Posición 3D de la cámara
// Intrínsecos de la cámara considerados (indexados por view.id_cam)
Intrínsecos intrínsecos; Intrínsecos de la cámara
// Estructura (puntos 3D y sus observaciones 2D)
Estructura de puntos de referencia; // Puntos 3D asociados con características de vista 2D
}
El siguiente es un ejemplo:
#1.features_siftPutativeMatches
Este ejemplo hace varias cosas (traducción directa del ejemplo oficial):
Extraer SIFT características de las dos imágenes (usando vlsift no gratuito) y forme una descripción de la característica;
Haga coincidir los puntos de las características en las dos imágenes de acuerdo con la descripción de la característica (método BRUTE_FORCE_L2);
Mostrar resultados coincidentes;
Inicialmente encontrará un error de falla de aserción. El método de tratamiento se describe en el artículo anterior. Una vez que la operación sea exitosa, se generarán tres archivos en el directorio del proyecto: 00_images.jpg, 01_features.jpg, 02_siftMatches.svg.
#2.features_affine_demo
Este ejemplo es un ejemplo de extracción de características para imágenes MSER (referencia) y TBMR. MSER (Regiones Extremas Máximamente Estables) es una imagen en escala de grises con invariancia de transformación afín, quizás este sea también el origen del nombre de este ejemplo. El algoritmo TBMR (Región Morse basada en árboles) no se comprende muy bien. Los detalles se pueden encontrar en Google Scholar
TBMR (Región Morse basada en árboles)
#3. /p>
Este ejemplo muestra el uso de la interfaz Image_describer para extraer descriptores de características, realizar coincidencias y mostrar los resultados. Este ejemplo puede elegir el algoritmo SIFT, AKAZE_MLDB o AKAZE. AKAZE presentado aquí 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 está utilizando el depurador VS2013) y el valor de sImage_describer_type se puede modificar directamente para realizar pruebas.
#4.features_kvld_filter y características_repeatability
Estos dos también tratan sobre la extracción y coincidencia de características. En el ejemplo de kvld, debido a que el contenido de regiones.h se cambió antes, algunas interfaces de funciones también. necesita ser Realice los cambios correspondientes, específicamente agregando la opción de función de alineación al vector.
#5. multiview_robust_homography_guided y multiview_robust_fundamental_guided
Estas dos muestras estiman la matriz singular y la matriz característica y determinan las coincidencias a su vez en función de esta información. Ambas muestras tardan mucho en ejecutarse (cuando la resolución es alta), y la primera muestra también encuentra errores al usar diferentes fotografías, presumiblemente durante DoG, los detalles específicos no se han estudiado -----
#6.Exif_Parsing
Extraiga información EXIF, compílela y ejecútela a través de la línea de comando, el formato del parámetro es: --imafile la ruta de su foto, con / barra diagonal en la ruta.
Otro artículo: Aprendizaje de openMVG - Instalación e introducción
#7.multiview_robust_essential
Estime la matriz fundamental y calcule la estructura 3D. Este ejemplo se ejecuta directamente y produce una nube de puntos muy escasa sin información de color.