Python computer vision (4) - calibración de cámara

1. Principios de la calibración de la cámara

    El propósito de la calibración de la cámara es obtener los parámetros de la propia cámara. Los parámetros de calibración apropiados son los requisitos previos para que la cámara obtenga con precisión la información del objetivo. Este artículo presenta el método de calibración de la cámara de Zhang Zhengyou. El proceso de calibración de la cámara es convertir el sistema de coordenadas del mundo al sistema de coordenadas de la cámara a través de la transformación del cuerpo rígido, luego convertir el sistema de coordenadas de la cámara al sistema de coordenadas de la imagen a través de la transformación de proyección, y finalmente convertir el sistema de coordenadas de la imagen al sistema de coordenadas de píxeles a través de transformación de la traducción. La relación de conversión del sistema de coordenadas durante el disparo de la cámara se muestra en la siguiente figura.

Diagrama de conversión del sistema de coordenadas

 2. Método de calibración de la cámara Zhang Zhengyou

    La calibración de Zhang Zhengyou se refiere al método de calibración de cámara de tablero de ajedrez de un solo plano propuesto por el profesor Zhang Zhengyou en 1998. Este método se encuentra entre el método de calibración tradicional y el método de autocalibración. No solo supera las deficiencias del objeto de calibración de alta precisión requerido por el método de calibración tradicional, sino que también mejora la precisión y es fácil de operar en comparación con el método de autocalibración. método de calibración. Por lo tanto, el método de calibración de Zhang Zhengyou se usa ampliamente en la visión por computadora.

Pasos generales del método de calibración de Zhang Zhengyou:

1. Imprima un trozo de papel A4 de tablero de ajedrez (se conoce el espaciado en blanco y negro) y péguelo en una placa plana

2. Tome varias fotos para el tablero de ajedrez (generalmente 10-20 fotos)

3. Detectar puntos característicos (esquinas de Harris) en la imagen

4. Resuelva la matriz homográfica de acuerdo con la información de la posición de la esquina y las coordenadas en la imagen

5. Usando el método de estimación de solución analítica para calcular 5 parámetros internos y 6 parámetros externos

6. De acuerdo con la estrategia de estimación de máxima verosimilitud, diseñe el objetivo de optimización y realice el refinamiento de los parámetros.

3. Principio matemático del método de calibración de Zhang Zhengyou

3.1 Introducción de parámetros

Puntos de imagen 2D:m=\begin{pmatrix} u & v \end{pmatrix}^{T}

punto espacial 3D:M=\bigl(\begin{matriz pequeña} X, Y y Z \end{matriz pequeña}\bigr)^{T}

Coordenadas homogéneas: \tilde{m}=\begin{pmatrix} u &v &1 \end{pmatrix}^{T},\tilde{M}=\begin{pmatrix} X &Y &Z &1 \end{pmatrix}^{T}

Describa el mapeo de las coordenadas espaciales a las coordenadas de la imagen:

s: factor de escala del sistema de coordenadas mundial al sistema de coordenadas de la imagen

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

\begin{pmatrix} R & t \end{pmatrix}: matriz extrínseca

(u_{0},v_{0}): Como coordenadas del punto principal

α, β: fusión de distancia focal y relación de aspecto de píxeles

γ: parámetro de distorsión radial 

3.2 Solución de parámetros internos

Suponga que el tablero de ajedrez está ubicado en Z = 0,

Defina la i-ésima columna de la matriz de rotación R como Rhode Island}, luego:

Luego, la asignación de espacio a imagen se puede cambiar a:

s\tilde{m}=H\tilde{M}     

H=K\bigl(\begin{matriz pequeña} r_{1} & r_{2}& t \end{matriz pequeña}\bigr)

Donde H es una descripción de la matriz homográfica, que se puede resolver por mínimos cuadrados desde las coordenadas mundiales de las esquinas hasta las coordenadas de la imagen

Sea H H = [h1 h2 h3]

La homografía tiene 8 grados de libertad, mediante la operación matricial de la ecuación anterior, según la ortogonalidad de r1 y r2, y las restricciones de normalización, se puede obtener la siguiente ecuación:

definición  B=K^{-T}K^{-1}== \begin{pmatrix} B_{11} & B_{21} & B_{31}\\ B_{12}& B_{22} & B_{32}\\ B_{13}& B_{23} & B_{33 } \end{matrix} _

 B es una matriz simétrica y su incógnita se puede expresar como un vector 6D b=\begin{bmatriz} B_{11} & B_{12} &B_{22} &B_{13} &B_{23} & B_{33} \end{bmatriz}^{T}

Sea la i-ésima columna en H  h_{i}=\bigl(\begin{pequeña matriz} h_{i1} & h_{i2} & h_{i3} \end{pequeña matriz}\bigr)^{T}, según la definición de b, deducir:h_{i}^{T}Bh_{j}=v_{ij}^{T}b

Se puede deducir que:\begin{pmatrix} v_{12}^{T}\\ (v_{11}-v_{22})^{T} \end{pmatrix}b=0

Si hay n grupos de imágenes observadas, entonces V es una matriz de 2n x 6 Vb=0,

Según la definición de mínimos cuadrados, la solución de V b = 0 es V^{T}Vel vector propio correspondiente al valor propio más pequeño,

Por lo tanto, b se puede estimar directamente y los parámetros internos se pueden resolver a través de b más adelante.

Cuando la imagen observada n ≥ 3, se puede obtener la solución única de b; cuando n = 2, el parámetro de distorsión γ = 0 generalmente se puede establecer; cuando n = 1, solo se pueden estimar α y β, y en este momento generalmente se puede suponer que las coordenadas del punto principal suman tu_{0}0 v_{0}.

B=K^{-T}K^{-1}, B es una matriz simétrica construida por b,

Los parámetros internos se pueden calcular mediante la siguiente fórmula (descomposición de Cholesky):

 3.3 Resolución de parámetros externos

Los parámetros externos se pueden resolver por Homografía, H=\bigl(\begin{smallmatrix} h_{1} &h_{2} & h_{3} \end{smallmatrix}\bigr)=\lambda K\begin{pmatrix} r_{1} & r_{2} & t \end{matrix}se puede deducir:

 En términos generales, la solución R=\begin{pmatrix} r_{1} &r_{2} & r_{3} \end{pmatrix}no cumplirá con los estándares de ortogonalidad y normalización.En la operación real, R puede normalizarse a través de la descomposición SVD.

4. Procedimiento experimental

1. Prepare un tablero de ajedrez en blanco y negro de 5X5 como se muestra en la figura a continuación

2. Ajuste el ángulo de la cámara para tomar fotos de tablero de ajedrez en diferentes direcciones. El conjunto de imágenes se muestra en la figura a continuación.

 3. Extraiga los puntos de esquina del tablero de ajedrez en la imagen, y el conjunto de imágenes de puntos de esquina se muestra en la figura a continuación

Un ejemplo se muestra en la siguiente figura:

​​​​​​​

 

4. Código

import cv2
import numpy as np
import glob

# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差阈值0.001
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 35, 0.001)

# 获取标定板4*4角点的位置
objp = np.zeros((4*4,3), np.float32)
objp[:,:2] = np.mgrid[0:4,0:4].T.reshape(-1,2) # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y

obj_points = [] # 存储3D点
img_points = [] # 存储2D点

# 获取指定目录下.jpg图像的路径
images = glob.glob(r"/Users/xionglulu/Downloads/project1/BW/*.jpg")
# print(images)

i=0
for fname in images:
    # print(fname)
    img = cv2.imread(fname)
    # 图像灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    size = gray.shape[::-1]
    # 获取图像角点
    ret, corners = cv2.findChessboardCorners(gray, (4, 4), None)
    # print(corners)

    if ret:
        # 存储三维角点坐标
        obj_points.append(objp)
        # 在原角点的基础上寻找亚像素角点,并存储二维角点坐标
        corners2 = cv2.cornerSubPix(gray, corners, (1, 1), (-1, -1), criteria)
        #print(corners2)
        if [corners2]:
            img_points.append(corners2)
        else:
            img_points.append(corners)
        # 在黑白棋盘格图像上绘制检测到的角点
        cv2.drawChessboardCorners(img, (4, 4),corners, ret)
        i+=1
        cv2.imwrite('conimg'+str(i)+'.jpg', img)
        cv2.waitKey(10)
print(len(img_points))
cv2.destroyAllWindows()

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)

print('------照相机内参与外参------')
print("ret:", ret) # 标定误差
print("mtx:\n", mtx) # 内参矩阵
print("dist:\n", dist) # 畸变参数 distortion coefficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs) # 旋转向量 # 外参数
print("tvecs:\n", tvecs ) # 平移向量 # 外参数


img = cv2.imread(images[10])
print(images[10])
h, w = img.shape[:2]
# 计算一个新的相机内参矩阵和感兴趣区域(ROI)
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
print('------新内参------')
print (newcameramtx)
print('------畸变矫正后的图像newimg.jpg------')
newimg = cv2.undistort(img,mtx,dist,None,newcameramtx)
x,y,w,h = roi
newimg = newimg[y:y+h,x:x+w]
cv2.imwrite('newimg.jpg', newimg)
print ("newimg的大小为:", newimg.shape)

 5. Resultados experimentales

imagen original

Imagen después de la corrección de distorsión

 6. Análisis de resultados experimentales

(1)ret: El error calibrado, que representa el promedio o la suma de los errores de reproyección. El error de reproyección se refiere al error entre las coordenadas de píxeles predichas y las coordenadas de píxeles reales calculadas al proyectar las coordenadas 3D en un plano 2D cuando el resultado de la calibración se aplica a la imagen del tablero de ajedrez. Cuanto menor sea el error de reproyección, más preciso será el resultado de la calibración. El error de calibración en este experimento es 3,3357. Este error sigue siendo bastante grande, lo que puede deberse a la pequeña cantidad de imágenes o a la gran inclinación del ángulo de disparo.

(2) A partir de los resultados experimentales se puede ver que el valor del parámetro espaciamiento de píxeles en la matriz de referencia interna mtx es 0, lo que indica que el espaciamiento de píxeles de la cámara es uniforme. En este caso, el espaciamiento de píxeles adyacentes en la el plano de la imagen es igual.

(3) Casi no hay diferencia entre la imagen original y la imagen después de la corrección de la distorsión. Puede ser que los datos de calibración sean insuficientes o que la precisión de la placa de calibración sea baja: si los datos de calibración son insuficientes o la precisión de la calibración Si la placa es baja, afectará la precisión y la precisión de la calibración. Como resultado, el efecto de corrección de la distorsión no es bueno; o la distorsión de la imagen de la cámara es pequeña: si la distorsión de la imagen de la cámara es pequeña, la imagen después de la corrección de la distorsión no es muy diferente de la imagen original.

Supongo que te gusta

Origin blog.csdn.net/summer_524/article/details/130875263
Recomendado
Clasificación