Constellation Knowledge Network - Preguntas y respuestas sobre Bagua - ¿Para qué se utiliza openMVG?

¿Para qué se utiliza openMVG?

OpenMVG (open Multiple View Geometry): una biblioteca de geometría estéreo de múltiples vistas de código abierto. Esta es una biblioteca de código abierto muy conocida para manejar la geometría estéreo de múltiples vistas en CV. y proporciona un potente conjunto de interfaces, cada módulo ha sido probado y se esfuerza por brindar una experiencia consistente y confiable.

Dirección: github

Documentos: documentos

openMVG puede:

Resolver el problema de la coincidencia precisa de la geometría estéreo 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 (corrección, estimación, reconstrucción, tratamiento de superficies, etc.);

openMVG se esfuerza por proporcionar código altamente legible para facilitar el desarrollo secundario por parte de los desarrolladores. Las funciones principales están lo más optimizadas posible, por lo que es posible que necesite otras bibliotecas para completar su sistema. openMVG se divide en varios módulos grandes:

Biblioteca central: implementación del algoritmo central de cada función;

Muestra: le enseña cómo usarla;

Cadena de herramientas : Es decir, se pueden usar juntos (coincidencia de funciones de conjuntos de imágenes desordenadas, SfM, procesamiento de color y textura);

Instalación #0 (win1VS2013)

El primer paso, por supuesto, es clonar el código de github y luego seguir las instrucciones de CONSTRUCCIÓN. Lo que hay que tener en cuenta es:

plantilla operador T en línea|(T x, T y){.

return static_cast(static_cast(x) | static_cast(y));

};

Se recomienda Compile junto con opencv, el método está en CMakeLists.txt Modifique la opción correspondiente en el archivo a ON y luego agregue una entrada llamada OpenCV_DIR en la GUI de cmake. El valor es la ruta al opencv que ha instalado.

openMVG está muy bien escrito y proporciona un buen soporte para Windows, por lo que después de cmake, use VS para abrir la solución openMVG.sln generada y compilarla. El VS2013 que uso no es compatible con la nueva característica de C++: constexpr, por lo que se recomienda usar VS2015 o una versión más reciente. Si debe usar VS2013, puede hacer esto: elimine directamente el lugar donde está constexpr en src/openMVG. /cameras/Camera_Common.hpp, o puede cambiarlo a una función de plantilla:

Al ejecutar el ejemplo, encuentra un error aquí: Error de línea 86 de DenseStoraage.h: Error de aserción R6010, que es. Aparece un error de aserción y no ocurrirá en el modo de lanzamiento, pero casi siempre aparece en el modo de depuración. La razón queda clara al abrir la URL proporcionada por Eigen: la estructura de datos son matrices no alineadas. Este problema sigue siendo muy molesto para las personas que son nuevas en openMVG. El código de openMVG es muy elegante. Muchos tipos de datos se extienden a partir de clases o funciones de plantilla, y varios métodos específicos se extienden a través de funciones virtuales. Por lo tanto, trae obstáculos al problema de posicionamiento. Después de un día de arduo trabajo, finalmente se confirmó el motivo:

La clase Regions definida en el archivo regiones.h contiene el vector contenedor stl de tipos Eigen vectorizables de tamaño fijo según la solución proporcionada por Eigen. , lo que debes hacer es:

//Original

typedef std::vector FeatsT;

//Cambiado a

typedef std ::vector> FeatsT;

// Se deben cambiar otros lugares similares, incluida la función que devuelve el vector, es mejor agregar EIGEN_MAKE_ALIGNED_OPERATOR_NEW

#1. Biblioteca principal

#1.1 Imagen

#Contenedor de imágenes

openMVG proporciona una clase básica utilizada como contenedor de imágenes: Imagen , T representa el tipo de píxel. Esta clase puede manejar imágenes en escala de grises, RGB, RGBA o de tipo personalizado.

El uso es muy simple:

// Una imagen gris de 8 bits:

Imagen grayscale_image_8bit;

// Imagen multicanal: (use pre - tipo de píxel definido)

// Una imagen RGB de 8 bits:

Imagen rgb_image_8bit;

// Imagen RGBA de 8 bits

Imagen rgba_image_8bit;

Imagen > rgba_image2_8bit;

RGBColor, RGBAColor, etc. aquí son tipos definidos por openMVG en función de Eigen, específicamente, está definido en pixel_types.hpp.

#Image I/O

openMVG admite archivos de imagen en formatos ppm/pgm, jpeg, png y tiff, ejemplo:

Imagen rgb_image_gray

bool bRet = ReadImage("Foo.imgExtension", &rgb_image);

#Operaciones de dibujo

Se utiliza para dibujar círculos, elipses, líneas rectas, etc. en imágenes.

#1.2 Valores numéricos

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).

#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. Son básicamente clases de plantilla, como una función de cribado. descripción Puedes hacer esto:

// SIFT como descriptor

typedef Descriptor siftDescriptorData;

#1.4 Cámara

Este módulo proporciona clases abstractas para diferentes modelos de cámara, que incluyen:

modelo de cámara #smallhole

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. parámetros, la clave Las palabras son las familiares: matriz de proyección, matriz de rotación y traslación, distancia focal, punto principal, etc. Consulte la descripción para obtener más detalles.

Mire un ejemplo: clase PinholeCamera proporcionada por openMVG:

/// Cámara estenopeica P = K[R|t], t = -RC

struct PinholeCamera

{

//Constructor

PinholeCamera(

const Mat3 & K = Mat3::Identity(),

const Mat3 & R = Mat3::Identidad(),

const Vec3 & t = Vec3::Cero())

: _K(K), _R(R), _t(t )

{

_C = -R.transpose() * t;

P_From_KRt(_K, _R, _t, &_P);

}

Cámara estenopeica(const Mat34 & P)

{

_P = P;

KRt_From_P(_P, &_K, &_R , &_t);

_C = -_R.transpose() * _t;

}

/// Matriz de proyección 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ámaras

Vec3 _C;

};

#1.5 Geometría multivista

Esta parte es uno de los módulos más básicos e importantes, que incluye:

Algoritmo de solución para n (>=2) vistas en geometría de conjunto de vistas múltiples;

Un marco general que combina estos algoritmos de solución para una estimación sólida: Kernel;

El El documento explica los conceptos de matriz de homografía, matriz propia, matriz esencial, matriz de posición, etc. Está muy bien explicado. Se recomienda leer el documento con atención. Una breve explicación:

Matriz de homografía: describe la relación entre dos planos de proyección;

Matriz propia: la relación entre la misma escena bajo la imagen de dos cámaras, también es la relación entre las posiciones de imagen del punto A en el objeto bajo dos ángulos de visión;

Matriz esencial: establecida en base a la matriz intrínseca y la matriz de parámetros internos, que describe la relación relativa entre la cámara y la posición de la matriz intrínseca;

p>

Matriz de posición: estima la posición absoluta de la cámara (convertida en un problema de minimización para resolver);

Kernel: una clase que combina solucionadores, datos, esquemas de medición, etc., esta clase 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, tales como: Max-Consensus, Max-Consensus, AC-Ransac A Contrario Ransac, etc.

#1.7 Coincidencia

Las interfaces proporcionadas incluyen: NNS, K-NN, FLANN, KVLD, hash en cascada del vecino más cercano, etc. Estas interfaces se pueden utilizar en conjuntos de puntos bidimensionales o tridimensionales, así como en 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 los puntos característicos correspondientes (las posiciones del mismo punto en diferentes ángulos de visión) 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 abordar 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 todas las entradas de SfM:

struct SfM_Data

{

/// Vistas consideradas

Vistas vistas; 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 poses; // Posición tridimensional de la cámara

/// Cámara considerada intrínsecos (indexado por view.id_cam)

Intrínsecos intrínsecos; // Intrínsecos de cámara

/// Estructura (puntos 3D con sus observaciones 2D)

Estructura de puntos de referencia ; // Puntos 3D asociados con características de vista 2D

}

El siguiente es un ejemplo:

#1. el ejemplo lo hace Aquí hay algunas cosas (traducción oficial directa):

Extraiga las características SIFT de las dos imágenes (usando el vlsift no gratuito) y forme una descripción de la característica;

Coincidir las dos imágenes de acuerdo con el descriptor de características Puntos destacados en la imagen (método BRUTE_FORCE_L2);

Muestre los resultados coincidentes;

Encontrará un error de aserción fallida al principio. Consulte el artículo anterior para saber cómo solucionarlo. Se generarán tres archivos en el directorio del proyecto después de una operación exitosa: 00_images.jpg, 01_features.jpg, 02_siftMatches.svg.

#2.features_affine_demo

Este ejemplo es una muestra de la extracción de características MSER (referencia) y TBMR (regiones extremas máximamente estables) de la región estable de valor extremo máximo. La escala de grises de la imagen es invariante a las transformaciones afines, razón por la cual se nombra este ejemplo. No sé mucho sobre el algoritmo TBMR (regiones Morse basadas en árboles). Puedes buscarlo en Google Scholar.

#3.features_image_matching

Este ejemplo proporciona un ejemplo del uso de la interfaz Image_describer para extraer descriptores de características, y comparar y mostrar los resultados. En el ejemplo, puede elegir el algoritmo SIFT, AKAZE_MLDB o AKAZE. Puede encontrar una introducción a AKAZE. 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 modificar directamente el valor de sImage_describer_type para realizar pruebas.

#4.features_kvld_filter yfeatures_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 en regiones.h se cambió antes, algunas interfaces de funciones corresponden. También se deben realizar cambios, específicamente agregando opciones de función de alineación al vector.

#5. multiview_robust_homography_guided y multiview_robust_fundamental_guided

Estos dos ejemplos estiman la matriz de homografía y la matriz propia y, a su vez, pueden determinar los puntos coincidentes en función de esta información. Ambas muestras tardaron mucho en ejecutarse (cuando la resolución era alta) y la primera encontró un error al usar otra foto. Probablemente fue un error durante DoG y no entré en detalles...

#6.exif_Parsing

Extraiga la información EXIF, compílela y ejecútela a través de la línea de comando. El formato del parámetro dado es: --imafile La ruta de su foto, use / barra diagonal en la ruta. .

Otro artículo: aprenda instalación e introducción a openMVG

#7.multiview_robust_essential

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.

上篇: Sueño con el Duque Zhou_Sueño con el Duque Zhou. 下篇:
Artículos populares