opencv - saber - prueba de camara web
¿Cómo verificar la corrección de la calibración de una cámara web? (2)
Esta es una respuesta bastante tardía, pero para las personas que vienen a esto de Google:
La forma correcta de verificar la precisión de la calibración es usar el error de reproyección proporcionado por OpenCV . No estoy seguro de por qué esto no se mencionó en ninguna parte de la respuesta o los comentarios; no es necesario que lo calcule a mano; es el valor de retorno de calibrateCamera
. En Python es el primer valor de retorno (seguido de la matriz de la cámara, etc.).
El error de reproyección es el error RMS entre donde se proyectarían los puntos utilizando los coeficientes intrínsecos y dónde se encuentran en la imagen real. Por lo general, debe esperar un error RMS de menos de 0.5px . Puedo obtener rutinariamente alrededor de 0.1px con cámaras de visión artificial. El error de reproyección se usa en muchos documentos de visión por computadora, no existe una forma significativamente más fácil o más precisa de determinar qué tan buena es su calibración.
A menos que tenga un sistema estéreo, solo podrá determinar dónde hay algo en el espacio 3D hasta un rayo, en lugar de un punto. Sin embargo, como uno puede calcular la posición de cada imagen de calibración plana, es posible determinar dónde debe caer cada esquina del tablero de ajedrez en el sensor de imagen. El proceso de calibración (más o menos) intenta determinar dónde caen estos rayos y minimiza el error sobre todas las diferentes imágenes de calibración. En el documento original de Zhang, y las evaluaciones posteriores, alrededor de 10-15 imágenes parecen ser suficientes; en este punto, el error no disminuye significativamente con la adición de más imágenes.
Otros paquetes de software como Matlab le proporcionarán estimaciones de errores para cada intrínseco individual, por ejemplo, longitud focal, centro de proyección. No he podido hacer que OpenCV escupe esa información, pero tal vez esté ahí en alguna parte. La calibración de la cámara ahora es nativa en Matlab 2014a, pero aún puede obtener la caja de herramientas de calibración de la cámara, que es extremadamente popular entre los usuarios de visión artificial.
http://www.vision.caltech.edu/bouguetj/calib_doc/
La inspección visual es necesaria, pero no suficiente cuando se trata de sus resultados. Lo más simple que debe buscar es que las líneas rectas en el mundo se vuelvan rectas en sus imágenes sin distorsión . Más allá de eso, es imposible estar realmente seguro si tus cámaras están bien calibradas simplemente mirando las imágenes de salida.
La rutina provista por Francesco es buena, sigue eso. Uso un estante como mi avión, con el patrón impreso en papel de póster. Asegúrate de que las imágenes estén bien expuestas. ¡Evita la reflexión especular! Uso un patrón estándar de 8x6, he probado patrones más densos pero no he visto una mejora en la precisión que marque la diferencia.
Creo que esta respuesta debería ser suficiente para la mayoría de las personas que desean calibrar una cámara: de manera realista, a menos que intentes calibrar algo exótico como un ojo de pez o lo estés haciendo por razones educativas, OpenCV / Matlab es todo lo que necesitas. El método de Zhang se considera lo suficientemente bueno como para que prácticamente todo el mundo en la investigación de la visión por computadora lo use, y la mayoría de ellos utilizan la caja de herramientas de Bouguet o OpenCV.
Soy totalmente nuevo en técnicas de calibración de cámara ... Estoy usando la técnica de tablero de ajedrez OpenCV ... Estoy usando una cámara web de Quantum ...
Aquí están mis observaciones y pasos ..
- He guardado cada lado cuadrado de ajedrez = 3.5 cm. Es un tablero de ajedrez de 7 x 5 con 6 x 4 esquinas internas. Estoy tomando un total de 10 imágenes en diferentes vistas / poses a una distancia de 1 a 1.5 m de la cámara web.
Estoy siguiendo el código C en Learning OpenCV por Bradski para la calibración. mi código para la calibración es
cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO);
Antes de llamar a esta función, estoy haciendo que el primer y el segundo elemento a lo largo de la diagonal de la matriz intrínseca sean uno para mantener constante la proporción de distancias focales y usar
CV_CALIB_FIX_ASPECT_RATIO
Con el cambio en la distancia del tablero de ajedrez, el
fx
yfy
cambian confx:fy
casi igual a 1. Hay valorescx
ycy
en el orden de 200 a 400. elfx
y elfy
son del orden de 300 - 700 cuando Cambio la distanciaActualmente, he puesto todos los coeficientes de distorsión a cero porque no obtuve buenos resultados, incluidos los coeficientes de distorsión. ¡Mi imagen original se veía hermosa que la sin distorsión!
¿Estoy haciendo la calibración correctamente? ¿Debo usar alguna otra opción que CV_CALIB_FIX_ASPECT_RATIO
? ¿Si sí, cual?
Hmm, ¿estás buscando "guapo" o "preciso"?
La calibración de la cámara es uno de los pocos temas en visión por computadora donde la precisión se puede cuantificar directamente en términos físicos y se puede verificar mediante un experimento físico. Y la lección habitual es que (a) sus números son tan buenos como el esfuerzo (y el dinero) que pone en ellos, y (b) la precisión real (a diferencia de lo imaginado) es costosa, por lo que debe averiguar de antemano su aplicación realmente requiere de precisión.
Si busca las especificaciones geométricas de incluso las combinaciones de lente / sensor más baratas (en el rango de megapíxeles y superior), resulta fácilmente evidente que la precisión de calibración sub-sub-mm es teóricamente alcanzable dentro de un volumen de espacio de mesa. Simplemente elabore (a partir de la hoja de especificaciones del sensor de su cámara) el ángulo sólido abarcado por un píxel: se verá deslumbrado por la resolución espacial que tiene al alcance de su billetera. Sin embargo, en realidad lograr REPETIBLEMENTE algo cerca de esa precisión teórica requiere trabajo.
Aquí hay algunas recomendaciones (de la experiencia personal) para obtener una buena experiencia de calibración con equipos de cosecha propia.
Si su método utiliza un objetivo plano ("tablero de ajedrez" o similar), fabrique uno bueno. Elija un respaldo muy plano (para el tamaño que menciona, el vidrio de ventana de 5 mm de grosor o más es excelente, aunque obviamente frágil). Verifique su planitud contra otro borde (o, mejor dicho, un rayo láser). Imprima el patrón en papel grueso que no se estirará demasiado fácilmente. Acuéstelo después de imprimir en la parte posterior antes de pegar y verifique que los lados cuadrados sean de hecho casi ortogonales. Las impresoras de chorro de tinta o láser económicas no están diseñadas para una precisión geométrica rigurosa, no confíe ciegamente en ellas. La mejor práctica es utilizar una imprenta profesional (incluso un Kinko''s hará un trabajo mucho mejor que la mayoría de las impresoras hogareñas). A continuación, coloque el patrón con mucho cuidado en la parte posterior, con pegamento en aerosol y limpie lentamente con un paño suave para evitar burbujas y estiramientos. Espere un día o más hasta que el pegamento se cure y que la tensión del papel adhesivo alcance su estado estable a largo plazo. Finalmente mida las posiciones de las esquinas con una buena pinza y una lupa. Puede salirse con un solo número para el tamaño cuadrado "promedio", pero debe ser un promedio de medidas reales, no de esperanzas-n-plegarias. La mejor práctica es utilizar una tabla de posiciones medidas.
Mire sus cambios de temperatura y humedad: el papel absorbe el agua del aire, el soporte se dilata y se contrae. Es sorprendente la cantidad de artículos que puede encontrar que informan precisiones de calibración submilimétricas sin citar las condiciones del entorno (o la respuesta del objetivo a ellas). Huelga decir que son en su mayoría basura. El coeficiente de dilatación a temperatura más baja del vidrio en comparación con la chapa común es otra razón para preferir el primero como respaldo.
Ni que decir tiene que debe desactivar la función de enfoque automático de su cámara, si tiene una: el enfoque mueve físicamente uno o más trozos de vidrio dentro de su lente, cambiando así (ligeramente) el campo de visión y (generalmente por mucho) la distorsión de la lente y el punto principal.
Coloque la cámara sobre un soporte estable que no vibrará fácilmente. Enfoque (y f-pare la lente, si tiene un iris) como se necesita para la aplicación (no la calibración: el procedimiento de calibración y el objetivo deben diseñarse para las necesidades de la aplicación, y no al revés). Ni siquiera pienses en tocar la cámara o la lente después. Si es posible, evite las lentes "complejas", por ejemplo, lentes con zoom o de gran angular. Ojo de pez o lentes anamórficas requieren modelos mucho más complejos que las existencias que OpenCV pone a disposición.
Tome muchas medidas e imágenes. Desea cientos de medidas (esquinas) por imagen y decenas de imágenes. En lo que respecta a los datos, cuanto más, mejor. Un tablero de ajedrez de 10x10 es el mínimo absoluto que consideraría. Normalmente trabajaba a 20x20.
Amplíe el volumen de calibración cuando toma imágenes . Idealmente, desea que sus mediciones se distribuyan uniformemente en el volumen de espacio con el que trabajará. Lo más importante es asegurarse de inclinar el objetivo significativamente con respecto al eje focal en algunas de las imágenes, para calibrar la distancia focal que necesita para "ver" un escorzo de perspectiva real. Para obtener mejores resultados, use una plantilla mecánica repetible para mover el objetivo. Una buena es una plataforma giratoria de un eje, que le dará un excelente modelo previo para el movimiento del objetivo.
Minimice las vibraciones y el desenfoque de movimiento asociado al tomar fotos.
Usa buena iluminación. De Verdad. Es sorprendente la frecuencia con la que veo a la gente darse cuenta al final del juego de que necesitas fotones para calibrar cualquier cámara :-) Usa luz ambiental difusa y rebota en las tarjetas blancas en ambos lados del campo de visión.
Mira lo que está haciendo tu código de extracción de esquina. Dibuje las posiciones de esquina detectadas en la parte superior de las imágenes (en Matlab u Octave, por ejemplo), y juzgue su calidad. Es mejor eliminar los valores atípicos prematuramente utilizando umbrales ajustados que confiar en el componente de refuerzo en el código de ajuste del paquete.
Restrinja su modelo si puede. Por ejemplo, no intente estimar el punto principal si no tiene una buena razón para creer que su lente está significativamente descentrada con respecto a la imagen, simplemente fíjela en el centro de la imagen en el primer intento. La ubicación del punto principal por lo general no se observa bien, porque se confunde intrínsecamente con el centro de la distorsión no lineal y por el componente paralelo al plano de la imagen de la traducción del objetivo a la cámara. Hacer las cosas bien requiere un procedimiento cuidadosamente diseñado que produzca tres o más puntos de fuga independientes de la escena y un muy buen horquillado de la distorsión no lineal. De forma similar, a menos que tenga motivos para sospechar que el eje focal del objetivo está realmente inclinado con respecto al plano del sensor, fije en cero el componente (1,2) de la matriz de la cámara. En términos generales, use el modelo más simple que satisfaga sus mediciones y las necesidades de su aplicación (esa es la maquinilla de afeitar de Ockam para usted).
Cuando tiene una solución de calibración de su optimizador con un error RMS lo suficientemente bajo (algunas décimas de píxel, por lo general, consulte también la respuesta de Josh a continuación), trace el patrón XY de los errores residuales (predicted_xy - measured_xy para cada esquina en todas las imágenes) y ver si se trata de una nube redonda centrada en (0, 0) . Los "grupos" de valores atípicos o falta de redondez de la nube de residuos están haciendo sonar las alarmas de que algo está muy mal: muy probablemente atípicos, o un modelo de distorsión de lente inapropiado.
Tome imágenes adicionales para verificar la precisión de la solución; utilícelas para verificar que la distorsión de la lente se haya eliminado realmente, y que la homografía plana predicha por el modelo calibrado realmente concuerde con la que se recuperó de las esquinas medidas.