Ocho, calibración de cámara monocular opencv+python

1. proceso de calibración de cámara monocular opencv

  • De acuerdo con el tamaño de la placa de calibración, determine las coordenadas de la placa de calibración en el mundo real
  • Tome fotografías de la placa de calibración desde diferentes ángulos
  • Use findChessboardCorners de opencv para calcular las coordenadas de las esquinas de cada tablero de calibración
  • Use la interfaz calibrateCamera de opencv para calibrar los parámetros de la cámara de acuerdo con las coordenadas 3D y las coordenadas de píxeles de los puntos de esquina

2. Defina las coordenadas de la placa de calibración en el mundo real

Hay dos formas de disparar la placa de calibración:

  • Fija la cámara y mueve la placa de calibración para lograr disparar desde diferentes ángulos
  • Fije la placa de calibración, mueva la cámara y dispare la placa de calibración desde diferentes ángulos

        Aquí asumimos que usamos el segundo método, arreglamos el tablero de calibración, arreglamos el sistema de coordenadas universales, seleccionamos cualquier punto de esquina en el tablero de calibración como el origen del sistema de coordenadas universales, los ejes x e y están a lo largo del plano del tablero de calibración , y el eje z es perpendicular al plano de la placa de calibración Dado que la placa de calibración siempre está en el plano xy, z=0 para todos los puntos en el plano de la placa de calibración.

A continuación, debe disparar la placa de calibración desde diferentes ángulos. Al disparar la placa de calibración, debe prestar atención a lo siguiente:

  • La distancia entre la placa de calibración y la cámara debe garantizar que la placa de calibración cubra al menos el 20 % del plano de imagen.
  • Tome al menos 10 ~ 20 fotos
  • Intente utilizar formatos de imagen sin comprimir, como PNG, para obtener una mayor precisión en una sola pasada.
  • Dispare la placa de calibración en diferentes direcciones en relación con la cámara, y el ángulo de desviación de la placa de calibración en relación con el plano de la cámara debe ser inferior a 45° tanto como sea posible
  • No modifique la imagen, como recortar la imagen tomada
  • Durante el proceso de disparo, no adopte el método de enfoque automático y no cambie la distancia focal durante el proceso
  • El patrón de la placa de calibración fotografiado ocupa la mayor parte del encuadre posible, y la distorsión de la lente aumentará radialmente con la distancia desde el centro, que no es uniforme en todo el encuadre. Para capturar la distorsión de la lente, el patrón debe cubrir el borde de la imagen capturada.

3. Solución de calibración

  • Primero encuentre las coordenadas 2D de la placa de calibración, la API correspondiente es:

retval, esquinas = cv2.findChessboardCorners(imagen, tamaño del patrón, banderas)

        imagen: una sola imagen de calibración de tablero de ajedrez, debe ser una imagen en color o en escala de grises de 8 bits

        patternSize: columna de cuadrícula de tablero de ajedrez, el número de puntos de esquina interior por fila (points_per_row, points_per_column)

        esquinas: genera la matriz de esquinas detectada

        banderas: define la forma de encontrar esquinas

cv2.cornerSubPix(imagen, esquinas, winsize, zeroZone, criterio)

        imagen: una sola imagen de calibración de tablero de ajedrez, debe ser una imagen en color o en escala de grises de 8 bits

        esquinas: Introduzca las coordenadas iniciales de los puntos de las esquinas

        winSize: la mitad de la longitud de la ventana de búsqueda

        criterio: Condiciones de terminación para las iteraciones de optimización de puntos de esquina, una es el número máximo de iteraciones de optimización de puntos de esquina cv2.TERM_CRITERIA_MAX_ITER, y la otra es que el desplazamiento de movimiento de los puntos de esquina es menor que cv2.TERM_CRITERIA_EPS

  • En el segundo paso de la calibración de la cámara, la API correspondiente es:

    retval , cameraMatrix, distCoeffs, rvecs, tvecs = cv2. Calibrar cámara (puntos de objeto, puntos de imagen, tamaño de imagen)

        objectPoints: un vector de puntos de esquina tridimensionales

        imagePoints: un vector de coordenadas de puntos 2D

        Tamaño de imagen: resolución de imagen

        cameraMatrix: matriz de parámetros internos de la cámara

        distCoefs: parámetros de distorsión

        rvecs: matriz de rotación

        tvecs: matriz de traducción

        retval: error de reproyección RMS

4. Corrección de distorsión

Después de la calibración, se puede realizar la corrección de la distorsión de la imagen, incluida la siguiente API:

newCameraMatrix, validPixROI = cv2. getOptimalNewCameraMatrix(cameraMatrix,distCoeffs, imageSize, alpha[, newImgSize[, centerPrinciplePoint]])

        cameraMatrix: referencia interna de la cámara

        distCoeffs: vector de entrada de parámetros de distorsión

        imageSzie: La resolución de la imagen original

        alfa: controla el método de retención de píxeles de corrección de distorsión, alfa = 0, lo que indica que todos los píxeles de la imagen corregida son válidos, alfa = 1, la imagen corregida conserva todos los píxeles de la imagen original

        nuevoCameraMatrix: basado en parámetros de escala libre, parámetros internos de cámara optimizados

        validPixROI: la región de píxeles válida de la imagen corregida

dist = cv2.undist(src, cameraMatrix, disCoeffs[, newCameraMatrix]), esta función es equivalente a la superposición de las siguientes dos funciones.

        src: la imagen original a corregir

        cameraMatrix: referencia interna de la cámara

        distCoeffs: vector de parámetros de distorsión

        dst: imagen de salida después de la corrección de distorsión

        newCameraMatrix: La referencia interna de la cámara correspondiente a la imagen a corregir

mapa1, mapa2 = cv2.initUndistortRectifymap(matriz de cámara, coeficientes de distribución, R, matriz de cámara nueva, tamaño, tipo m1)

        cameraMatrix: referencia interna de la cámara

        distCoeffs: parámetros de distorsión

        R: opcional, matriz de transformación rectificada 3*3

        newcameraMatrix: nuevos parámetros internos de la cámara, generalmente iguales a cameraMatrix en monocular

        tamaño: tamaño de imagen corregido

        map1: la primera matriz de mapeo, mapx(x,y)

        map2: la primera matriz de mapeo, mapy(x,y)

dst = cv .remap(src, map1,map2, interpolation[,dst[,borderMode[,borderValue]]])

        origen: imagen original

        dst: la imagen asignada, con el mismo tamaño y tipo de datos que src

        map1: la primera matriz de mapeo, la coordenada x de src correspondiente a dst (x, y)

        map2: La segunda matriz de mapeo, la coordenada y de src correspondiente a dst (x, y)

        interpolación: método de interpolación, interpolación lineal, etc.

        borderMode: el método de procesamiento del valor del borde

        borderValue: borderMode es la recarga diaria cuando se llena el valor fijo, el valor predeterminado es 0

Supongo que te gusta

Origin blog.csdn.net/csucmee502/article/details/130007305
Recomendado
Clasificación