Profundizar en los detalles técnicos de la función de calibración y posicionamiento de visión binocular

       Hablando de posicionamiento binocular, creo que muchas personas, como yo ahora, usarán fórmulas listas para usar, entenderán algunas definiciones y comprenderán el significado de esos parámetros, pero en profundidad, se estima que incluso el algoritmo de calibración del profesor Zhang Zhengyou no se ha entendido. Debido a que implica algunas habilidades de cálculo de matrices, no hay una base matemática, o la base no es sólida, es imposible comprenderlo en profundidad. He estado involucrado en la visión binocular durante dos años. Solía ​​generar un mapa de profundidad o realizar un alcance binocular. Copie y pegue el código en Internet y modifíquelo. Pero ahora, si desea desarrollar un posicionamiento de visión binocular de alta precisión, debe profundizar Excave y descubra todos los aspectos de la trayectoria de la luz de la imagen. Aquí, proporciono algunos blogs que resumen mejor en línea para allanar el camino a nuevos amigos: https://www.cnblogs.com/zyly/p/9366080.html  ; este blog no solo explica sistemáticamente el proceso de coordenadas de imágenes, sino también Una serie de blogs de referencia se enumeran al final de la publicación del blog, ¡gracias por ponerlo! " Big Ultraman lucha contra pequeños monstruos ";

           Hoy, hablemos primero de la distorsión de la lente, porque no hay lente sin distorsión, pero la magnitud de la distorsión es diferente. Por ejemplo, si usa una cámara de 4,3 mm (cámara USB pequeña), es básicamente una lente plana. Tienes que considerar la distorsión de la lente. Si está involucrado en mapas de profundidad y medición de distancia, básicamente está bien. Esos son todos de baja precisión. No importa si el error es grande. Es genial usar el método de calibración de Zhang Zhengyou o el doble objetivo Matlib para determinar la precisión. Pero si desea hacer una medición precisa y enredar la precisión de mm y, esos métodos no siempre lo satisfarán. Por ejemplo, ¡no puedes satisfacerme ahora! Qué hacer, profundiza en los detalles técnicos y encuentra la raíz.

           La grandeza del método de calibración de Zhang es que el proceso de calibración se puede simplificar para imprimir un tablero de ajedrez de papel A4 para obtener una precisión relativamente alta. ¡Aún no puede pegar papel A4 en el campo de calibración de la cámara fotogramétrica! Sin embargo, ¡todavía podemos usar el método de calibración de Zhang Zhengyou! Sin embargo, este método se utiliza para tratar el problema de la calibración con una consideración más seria de varios factores. ¡Este es el significado de la innovación de métodos!

Habiendo dicho tantas palabras adicionales, es descartar dos funciones de calibración de la cámara: Función OPENCV:

【A】 CV_EXPORTS_AS (calibrateCameraExtended) doble calibrateCamera (InputArrayOfArrays objectPoints,
                                     InputArrayOfArrays imagePoints, IMAGESIZE Tamaño,
                                     InputOutputArray cámaras matriciales, InputOutputArray distCoeffs,
                                     OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,
                                     outputArray stdDeviationsIntrinsics,
                                     outputArray stdDeviationsExtrinsics,
                                     outputArray perViewErrors,
                                     banderas int = 0, criterios TermCriteria = TermCriteria (
                                        TermCriteria :: COUNT + TermCriteria :: EPS, 30, DBL_EPSILON));

Esta función [A] es una función que admite el análisis y la calibración, y los resultados de la evaluación se dan en los parámetros de salida.
[B] CV_EXPORTS_W double calibrateCamera (InputArrayOfArrays objectPoints,
                                     InputArrayOfArrays imagePoints, Size imageSize,
                                     InputOutputArray cameraMatrix, InputOutputArray distCoeffs,
                                     OutputArrayOfArrays rvecs, OutputArrayOfArrays rvecs, OutputArriteriaOfArmeria,
                                     indicadores de TermCriteria =
                                        30 criterios de Termeria: DBL_EPSILON));

Esta función [B] solo es funcionalmente diferente de [A].

Las siguientes son algunas introducciones sobre cómo usar estas dos funciones, traducidas directamente de la función OPENCV, hay errores en la traducción, aquí está mi entendimiento:

1.InputArrayOfArrays objectPoints

Este objectPoints son las coordenadas mundiales de los puntos de las esquinas del tablero de ajedrez utilizado, por supuesto, esto viene dado por el tablero de calibración que utiliza. Por supuesto, si tiene que crear sus propias reglas de calibración, tenga en cuenta que su tipo de datos es std :: vector <std :: vector <cv :: Vec3f >>, lo que significa que puede generar tantas veces como tome fotos, y las coordenadas z son todas 0; 2.InputArrayOfArrays imagePoints

Este imagePoints, como su nombre indica, es para extraer las coordenadas de los puntos de la imagen de los puntos de las esquinas del tablero de ajedrez en la imagen. Tenga en cuenta que este es un tipo de datos de std :: vector <std :: vector <cv :: Vec2f >>. Esto le da una foto de esas coordenadas. Correspondencia uno a uno

3. InputOutputArray cameraMatrix

Se puede decir que esta es la matriz de parámetros dentro de la cámara, que se puede inicializar o no, y está relacionada con el modo de cálculo que elija más adelante.

4.InputOutputArray distCoeffs

Este es el foco de hoy, el parámetro de distorsión. Pueden ser 4, 5, 8, 12 o 14 elementos. Generalmente todo el mundo usa 5 parámetros y la precisión general es suficiente. En cuanto a si cuantos más parámetros son mejores para una alta precisión, algunas personas dicen que es fácil ser inestable. Puedo decirle con certeza que cuantos más parámetros para describir un modelo, mejor. Piense en el aprendizaje profundo actual, que ¡Los parámetros del modelo de red no son miles! Sin embargo, cuantos más parámetros tenga, más imágenes tendrá que tomar, ¡y su campo de calibración debe estar bien construido! Si utiliza papel A4 como tablero de calibración, deberá configurar tantos parámetros. ¿Piénsalo? La calidad de sus datos no está estructurada, ¡cómo ajustar y resolver la ecuación! Por lo tanto, este lugar es un punto de inflexión, pero para los requisitos generales de visión por computadora, 5 parámetros son casi iguales.

5. OutputArrayOfArrays rvecs, 6.OutputArrayOfArrays tvecs

Estos dos parámetros son los parámetros de rotación y traslación de la cámara con la placa de calibración como referencia durante el proceso de calibración.Piensa en la dirección aproximada de la lente que Matlib finalmente te dará durante el proceso de calibración.

 7.OutputArray stdDeviationsIntrinsics 8.OutputArray stdDeviationsExtrinsics 9.OutputArray perViewErrors

Estos parámetros son una evaluación de los resultados de esta calibración. Cuanto menor sea el valor, mejor será su calibración.

10. int flags = 0,

El parámetro banderas generalmente se establece en 0, y el truco está aquí. Por lo general, se requiere una calibración de precisión y la calibración suele ser necesaria varias veces. Controle algunos parámetros de alta confianza sin cambios y luego resuelva otros. Si el parámetro de distorsión no es un modelo de 5 parámetros, este ajuste se refiere a la explicación de la función.

11.TermCriteria criterios = TermCriteria (TermCriteria :: COUNT + TermCriteria :: EPS, 30, DBL_EPSILON)

Esta configuración es una configuración de iteración de cálculo y generalmente no cambia. Si tiene una calibración de alta precisión, también debe estudiarla detenidamente.El primer parámetro es el tipo es la condición de terminación de la iteración de cálculo, el segundo es el número de iteraciones y el tercero es el umbral establecido. El valor predeterminado significa que la condición de terminación de la iteración observa los dos parámetros siguientes, el número máximo de iteraciones es 30 y el umbral mínimo es DBL_EPSILON.

Los detalles técnicos de la función de calibración son como tales. Si tiene alguna idea, bienvenido a discutir, ¡y actualmente estoy investigando la medición de visión de precisión!

La referencia es la siguiente:

/ ** @brief encuentra los parámetros internos y externos de la cámara a partir de múltiples vistas del patrón de calibración.

@param objectPoints En la nueva interfaz, es el vector de los vectores de puntos del modo de
calibración Espacio de coordenadas del modo de calibración (por ejemplo, std :: vector <std :: vector <cv :: Vec3f >>). El
vector exterior contiene tantos elementos como vistas de esquema haya. Si el modo de calibración es el mismo que se
muestra en cada vista y es completamente visible, todos los vectores serán iguales. No obstante,
se pueden usar patrones parcialmente ocluidos, o incluso diferentes patrones en diferentes vistas. Entonces el
vector será diferente. Estos puntos son 3D, pero debido a que están en el sistema de coordenadas del patrón
, si la máquina perforadora es plana, entonces tiene sentido colocar el modelo en el plano de coordenadas XY.
La coordenada Z de cada punto del objeto de entrada es 0.
En la interfaz anterior, todos los vectores de puntos de objeto de diferentes vistas están conectados entre
sí.
@param imagePoints En la nueva interfaz, es el
punto de modo vectorial del vector de proyección de calibración (por ejemplo, std :: vector <std :: vector <cv :: Vec2f >>). imagePoints.size () y
objectPoints.size () e imagePoints [i] .size () deben ser iguales a objectPoints [i] .size () para cada i.
En la interfaz anterior, todos los vectores de puntos de objeto de diferentes vistas están conectados entre
sí.
@param imageSize solo se usa para inicializar el tamaño de imagen de la matriz intrínseca de la cámara.
@param cameraMatrix salida 3x3 matriz de cámara de punto flotante
\ f $ A = \ vecthreethree {f_x} {0} {c_x} {0} {f_y} {c_y} {0} {0} {1} \ f $. Si se especifican CV \ _CALIB \ _USE \ _INTRINSIC \ _GUESS
y / o CV_CALIB_FIX_ASPECT_RATIO, se deben
inicializar algunos o todos fx, fy, cx, cy antes de llamar a la función.
@param distCoeffs vector de salida de coeficientes de distorsión
\ f $ (k_1, k_2, p_1, p_2 [, k_3 [, k_4, k_5, k_6 [, s_1, s_2, s_3, s_4 [, \ tau_x, \ tau_y]]]]) \ f $ de
4, 5, 8, 12 o 14 elementos.
@param rvecs es el vector de salida del vector de rotación estimado para cada vista de modo (ver Rodrigues)
(por ejemplo, std :: vector <cv :: Mat >>). Es decir, cada k-ésimo vector de rotación y el
k-ésimo vector de traslación correspondiente (ver la siguiente descripción del parámetro de salida) llevan el modo de calibración
del espacio de coordenadas del modelo (se especifica el punto del objeto) al
espacio de coordenadas mundial , es decir, el k-ésimo La posición real del patrón de calibración en cada vista de modo (k = 0 .. * M * -1).
@param tvecs es el vector de salida del vector de traducción estimado para cada vista de modo.
@param stdDeviationsIntrinsics es el vector de salida de la desviación estándar estimada por los parámetros intrínsecos.
 El orden de los valores de desviación:
\ f $ (f_x, f_y, c_x, c_y, k_1, k_2, p_1, p_2, k_3, k_4, k_5, k_6, s_1, s_2, s_3,
 s_4, \ tau_x, \ tau_y) \ f $ Si uno de los parámetros no se estima, su desviación es igual a cero.
@param stdDeviationsExtrinsics El vector de salida de la desviación estándar de las estimaciones de los parámetros externos.
 El orden de los valores de desviación: \ f $ (R_1, T_1, \ dotsc, R_M, T_M) \ f $ donde M es el número de vistas de modo,
 \ f $ R_i, T_i \ f $ conecta vectores 1x3.
 @param perViewErrors es el vector de salida del error de reproyección RMS estimado para cada vista de modo.
Las banderas de @param pueden ser cero banderas diferentes o una combinación de los siguientes valores:
 - ** CV_CALIB_USE_INTRINSIC_GUESS ** cameraMatrix contiene valores iniciales válidos
fx, fy, cx, cy para una mayor optimización. De lo contrario, (cx, cy) se establece inicialmente en el
centro de la imagen (usando imageSize) y la distancia focal se calcula en el método de mínimos cuadrados.
Tenga en cuenta que si se conocen los parámetros internos, no es necesario utilizar esta función solo para
estimar los parámetros externos. En su lugar, utilice solvePnP.
 - ** CV_CALIB_FIX_PRINCIPAL_POINT ** El punto principal no ha cambiado durante el período global
Optimización. Se queda en el centro o
también se establece una ubicación diferente designada como CV_CALIB_USE_INTRINSIC_GUESS.
 - La función ** CV_CALIB_FIX_ASPECT_RATIO ** solo considera fy como un parámetro libre. La
relación fx / fy sigue siendo la misma que la de la matriz de cámara de entrada. Cuando
CV_CALIB_USE_INTRINSIC_GUESS no está configurado, los valores de entrada reales de fx y fy se
ignoran, y solo su relación se calcula y se usa más.
 - ** CV_CALIB_ZERO_TANGENT_DIST ** Establece el coeficiente de distorsión tangencial \ f $ (p_1, p_2) \ f $ a
cero y mantenlo en cero.
 - ** CV_CALIB_FIX_K1, ..., CV_CALIB_FIX_K6 ** Los
coeficientes de distorsión radial correspondientes permanecen sin cambios durante la optimización. Si se
establece CV_CALIB_USE_INTRINSIC_GUESS, se utilizan los coeficientes de la matriz distCoeffs proporcionada. De lo contrario, se establece en 0.
 - ** CV_CALIB_RATIONAL_MODEL ** Habilita los coeficientes k4, k5 y k6. Para proporcionar
compatibilidad con versiones anteriores, esta bandera adicional debe especificarse claramente para que la
función de calibración utilice un modelo racional y devuelva 8 coeficientes. Si no se
establece el indicador , la función solo calcula y devuelve 5 coeficientes de distorsión.
 - ** CALIB_THIN_PRISM_MODEL ** Habilita los coeficientes s1, s2, s3 y s4.

Para proporcionar compatibilidad con versiones anteriores, este indicador adicional debe especificarse claramente para que la
función de calibración utilice un modelo de prisma delgado y devuelva 12 coeficientes. Si no se
establece el indicador , la función solo calcula y devuelve 5 coeficientes de distorsión.
 - ** CALIB_FIX_S1_S2_S3_S4 ** El coeficiente de distorsión del prisma delgado no cambiará durante este período de
optimización. Si se establece CV_CALIB_USE_INTRINSIC_GUESS, los coeficientes provienen de la
matriz distCoeffs proporcionada. De lo contrario, se establece en 0.
 - ** CALIB_TILTED_MODEL ** Los coeficientes tauX y tauY están habilitados. Para proporcionar
compatibilidad con versiones anteriores, esta bandera adicional debe especificarse claramente para realizar la
función de calibración utilizando el modelo del sensor de inclinación y devolver 14 coeficientes. Si no se
establece el indicador , la función solo calcula y devuelve 5 coeficientes de distorsión.
 - ** CALIB_FIX_TAUX_TAUY ** Los coeficientes del modelo del sensor de inclinación no cambiarán durante este período de
optimización. Si se establece CV_CALIB_USE_INTRINSIC_GUESS, los coeficientes provienen de la
matriz distCoeffs proporcionada. De lo contrario, se establece en 0.
Criterios de @param Criterios de terminación del algoritmo de optimización iterativa.

Esta función estima la conversión entre dos cámaras que forman un par estéreo. Si tiene una
cámara estéreo , las posiciones relativas y las direcciones de las dos cámaras son fijas. Si calcula
las poses del objeto en relación con la primera cámara y la segunda cámara (R1, T1) y (R2, T2),
respectivamente Hecho con solvePnP), esas posturas definitivamente están relacionadas entre sí.
Esto significa que dado (\ f $ R_1 \ f $, \ f $ T_1 \ f $), debería ser posible calcular (\ f $ R_2 \ f $, \ f $ T_2 \ f $). Solo
necesita conocer la posición y orientación de la segunda cámara en relación con la primera cámara. Esta es
la función de la función descrita. Calcula (\ f $ R \ f $, \ f $ T \ f $) para:

\ F [R_2 = R * R_1
T_2 = R * T_1 + T , \ f]

Opcionalmente, calcula la matriz fundamental E:

\ f [E = \ vecthreethree {0} {- T_2} {T_1} {T_2} {0} {- T_0} {- T_1} {T_0} {0} * R \ f]

Entre ellos, \ f $ T_i \ f $ es un componente del vector de traslación \ f $ T \ f $: \ f $ T = [T_0, T_1, T_2] ^ T \ f $. Y la función
también puede calcular la matriz fundamental F:

\ f [F = cameraMatrix2 ^ {- T} E cameraMatrix1 ^ {- 1} \ f]

Además de la información relacionada con el estéreo, esta función también puede realizar una calibración completa de cada una de las
dos cámaras. Sin embargo, debido a las grandes dimensiones del espacio de parámetros y los
datos ruidosos en la entrada , esta función puede desviarse de la solución correcta. Si los parámetros internos se
pueden estimar con alta precisión para cada cámara individualmente (por ejemplo, usando
calibrateCamera), se recomienda que lo haga y luego pase el indicador CV_CALIB_FIX_INTRINSIC a la
función y los parámetros internos calculados. De lo contrario, si todos los parámetros se
estiman a la vez, tiene sentido limitar algunos parámetros, por ejemplo, a través de las
banderas CV_CALIB_SAME_FOCAL_LENGTH y CV_CALIB_ZERO_TANGENT_DIST, que suele ser una
suposición razonable.

Al igual que calibrateCamera, esta función minimiza todos los errores de
reproyección que apuntan a todas las vistas disponibles de ambas cámaras. El valor final devuelto por esta función se
reproyecta incorrectamente.
 * /

 

Supongo que te gusta

Origin blog.csdn.net/sun19890716/article/details/89372497
Recomendado
Clasificación