Pregunta

Así que soy muy nuevo en OpenCV (2.1), así que tenga en cuenta eso.

Así que logré calibrar mi cámara web barata que estoy usando (con un gran angular Adjunto), utilizando el método de calibración del tablero de ajedrez para producir los coeficientes intrínsecos y de distorsión.

Luego no tengo problemas para volver a alimentar estos valores y producir mapas de imagen, que luego aplico a una alimentación de video para corregir las imágenes entrantes.

Sin embargo, me encuentro con un problema. Sé que cuando deforma/corrige la imagen, crea varias secciones sesgadas y luego formatea la imagen para recortar las áreas negras. Mi pregunta es entonces ¿puedo ver la imagen deformada completa, incluidas algunas regiones que tienen áreas negras? A continuación se muestra un ejemplo de las regiones negras con secciones sesgadas que estaba tratando de transmitir si mi terminología estaba apagada:

Una imagen mejor que transmite las regiones de las que estoy hablando puede ser Encontrado aquí! Esta imagen fue descubierta en este correo.

Corrientemente: El CVREMAP () devuelve básicamente la caja amarilla en la imagen vinculada arriba, pero quiero ver la imagen completa, ya que hay datos relevantes que estoy buscando sacar de ella.

Lo que he probado: Aplicar una conversión de escala al mapa de la imagen para que se ajuste a la imagen completa (incluidas las piezas estiradas) en el marco

        CvMat *intrinsic = (CvMat*)cvLoad( "Intrinsics.xml" );
        CvMat *distortion = (CvMat*)cvLoad( "Distortion.xml" );

        cvInitUndistortMap( intrinsic, distortion, mapx, mapy );

        cvConvertScale(mapx, mapx, 1.25, -shift_x);   // Some sort of scale conversion
        cvConvertScale(mapy, mapy, 1.25, -shift_y);   // applied to the image map

        cvRemap(distorted,undistorted,mapx,mapy);

El CVConvertScale, cuando creo que he alineado el cambio X/Y correctamente (adivinar/verificar), de alguna manera distorsiona el mapa de la imagen, lo que hace que la corrección sea inútil. Puede haber algunas matemáticas involucradas aquí que no estoy siguiendo correctamente/comprensión.

¿Alguien tiene alguna otra sugerencia para resolver este problema o lo que podría estar haciendo mal? También intenté escribir mi propio código para solucionar problemas de distorsión, pero digamos que OpenCV ya sabe cómo hacerlo bien.

¿Fue útil?

Solución

De memoria, debes usar InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2), de los cuales InitUndistortMap es una versión simplificada.

cvInitUndistortMap( intrinsic, distort, map1, map2 )

es equivalente a:

cvInitUndistortRectifyMap( intrinsic, distort, Identity matrix, intrinsic, 
                           map1, map2 )

Los nuevos parámetros son R y newCameraMatrix. R especies Una transformación adicional (por ejemplo, rotación) para realizar (solo colóquela en la matriz de identidad).

El parámetro de interés para usted es newCameraMatrix. En InitUndistortMap Esto es lo mismo que la matriz de cámara original, pero puede usarla para obtener ese efecto de escala del que está hablando.

Obtienes la nueva matriz de cámara con GetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...). Básicamente te alimentas intrinsic, distort, su tamaño de imagen original y un parámetro alpha (junto con contenedores para mantener la matriz de resultados, ver documentación). El parámetro alpha logrará lo que quieras.

Cito de la documentación:

La función calcula la nueva matriz de cámara óptima basada en el parámetro de escala libre. Al variar este parámetro, el usuario puede recuperar solo píxeles sensibles alfa = 0, Mantenga todos los píxeles de la imagen originales si hay información valiosa en las esquinas alfa = 1, o obtener algo en el medio. Cuando Alpha> 0, el resultado de la falta de distorsión probablemente tendrá algunos píxeles negros correspondientes a píxeles "virtuales" fuera de la imagen distorsionada capturada. La matriz de la cámara original, los coeficientes de distorsión, la nueva matriz de cámara calculada y el NewImageSize deben pasar a InitundistortricTifyMap para producir los mapas para la reasignación.

Así que para el ejemplo extremo con todas las bits negras que muestran que quieres alpha=1.

En resumen:

  • llamar cvGetOptimalNewCameraMatrix con alpha=1 para obtener newCameraMatrix.
  • usar cvInitUndistortRectifymap con R Ser matriz de identidad y newCameraMatrix establecido en el que acabas de calcular
  • alimentar los nuevos mapas en cvRemap.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top