calibración de la cámara

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

1.1 Cómo produce la cámara las imágenes:

El sistema de imágenes de la cámara contiene un total de cuatro sistemas de coordenadas: sistema de coordenadas mundial, sistema de coordenadas de la cámara, sistema de coordenadas de imagen y sistema de coordenadas de píxeles.

1.1.1 Sistema de coordenadas mundial: El
sistema de coordenadas mundial (coordenada mundial), también llamado sistema de coordenadas de medición, es un sistema de coordenadas rectangular tridimensional, a partir del cual se puede describir la posición espacial de la cámara y el objeto a medir. La posición del sistema de coordenadas mundial se puede determinar libremente según la situación real.

1.1.2 Sistema de coordenadas de la cámara:
El sistema de coordenadas de la cámara también es un sistema de coordenadas rectangular tridimensional. El origen está ubicado en el centro óptico de la lente. Los ejes x e y son paralelos a ambos lados del plano de fase respectivamente. El eje z es el eje óptico de la lente y está alineado con la imagen Plano vertical
1.1.3 Sistema de coordenadas de píxeles, sistema de coordenadas de imagen:

El sistema de coordenadas de píxeles (coordenadas de píxeles)
es como se muestra en la figura anterior. El sistema de coordenadas de píxeles es un sistema de coordenadas rectangular bidimensional que refleja la disposición de los píxeles en el chip CCD / CMOS de la cámara. El origen está ubicado en la esquina superior izquierda de la imagen y los ejes y ejes son paralelos a ambos lados del plano de la imagen. La unidad del eje de coordenadas en el sistema de coordenadas de píxeles son píxeles (enteros).

El sistema de coordenadas de píxeles no es propicio para la transformación de coordenadas, por lo que es necesario establecer un sistema de coordenadas de imagen. La unidad de su eje de coordenadas suele ser milímetros (mm) y el origen es la intersección del eje óptico de la cámara y el plano de fase (llamado el punto principal), que es el punto central de la imagen. Los ejes y los ejes son paralelos a los ejes y los ejes respectivamente. Por lo tanto, los dos sistemas de coordenadas están en realidad en una relación de traslación, que se puede obtener mediante traducción.

1.2 El propósito de la calibración de la cámara:
encontrar los parámetros internos y externos de la cámara, así como los parámetros de distorsión.

Después de calibrar una cámara, normalmente querrás hacer dos cosas: una es que, dado que el grado de distorsión de cada lente es diferente, la calibración de la cámara puede corregir la distorsión de la lente y generar una imagen corregida; la otra es reconstruir la imagen basándose en la imagen obtenida Construya una escena tridimensional.

1.2 El principio general de la calibración de la cámara:
la calibración de la cámara (calibración de la cámara) es simplemente el proceso de cambiar del sistema de coordenadas mundial al sistema de coordenadas de la imagen, que es el proceso de encontrar la matriz de proyección final.

2. Pasos de calibración de la cámara

1) Prepare un tablero de ajedrez para el método de calibración de Zhang Zhengyou. Se conoce el tamaño del tablero de ajedrez y use una cámara para dispararlo desde diferentes ángulos para obtener un conjunto de imágenes;

2) Detecte los puntos característicos en la imagen, como los puntos de las esquinas del tablero de calibración, para obtener las coordenadas de píxeles de los puntos de las esquinas del tablero de calibración. Según el tamaño conocido del tablero de ajedrez y el origen del sistema de coordenadas mundial, calcule la física coordenadas de los puntos de las esquinas del tablero de calibración. ;

3) Resuelva la matriz de parámetros internos y la matriz de parámetros externos.

De acuerdo con la relación entre los valores de las coordenadas físicas y los valores de las coordenadas de los píxeles, calcule la matriz H, luego construya la matriz V, resuelva la matriz B, use la matriz B para resolver la matriz A de parámetros internos de la cámara y finalmente resuelva la matriz externa de la cámara. matriz de parámetros correspondiente a cada imagen:

4) Resuelva los parámetros de distorsión.

Construya la matriz D y calcule los parámetros de distorsión radial;

5) Utilice el algoritmo LM (Levenberg-Marquardt) para optimizar los parámetros anteriores

3. Implementar
3.1 Preparación de datos

Tome fotografías de la placa de calibración en diferentes ángulos y obtenga 10 fotografías. Obtenga una imagen similar a la siguiente.

3.2 Código (Python+OpenCV)

import cv2
import numpy as np
import glob

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

# 获取标定板角点的位置
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点

images = glob.glob(r"D:\software\pycharm\PycharmProjects\computer-version\biaoding\images\*.jpg")
i = 0
for fname in images:
    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, (5, 5), (-1, -1), criteria)  # 在原角点的基础上寻找亚像素角点
        # print(corners2)
        if [corners2]:
            img_points.append(corners2)
        else:
            img_points.append(corners)

        cv2.drawChessboardCorners(img, (4, 4), corners, ret)  # 记住,OpenCV的绘制函数一般无返回值
        i += 1
        cv2.imwrite('conimg' + str(i) + '.jpg', img)
        cv2.waitKey(1500)

print(len(img_points))
cv2.destroyAllWindows()

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

print("内参数矩阵:\n", mtx)  # 内参数矩阵
print("畸变系数:\n", dist)  # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("旋转向量:\n", rvecs)  # 旋转向量  # 外参数
print("平移向量:\n", tvecs)  # 平移向量  # 外参数

print("-----------------------------------------------------")

img = cv2.imread(images[2])
h, w = img.shape[:2]
# 获取新的相机矩阵和ROI
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# 进行畸变校正
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# 裁剪校正后的图片,去掉黑边
x, y, w, h = roi
dst = dst[y:y + h, x:x + w]
# 保存校正后的图片
cv2.imwrite('undistorted.jpg', dst)
print("校正后的图片已保存到文件 'undistorted.jpg'")

El resultado es el siguiente:

D:\software\anaconda3\envs\homework\python.exe D:\software\pycharm\PycharmProjects\computer-version\biaoding\biaoding.py 
10
内参数矩阵:
 [[2.96560599e+04 0.00000000e+00 1.14649373e+03]
 [0.00000000e+00 2.27193976e+04 2.23086118e+03]
 [0.00000000e+00 0.00000000e+00 1.00000000e+00]]
畸变系数:
 [[-2.89172774e+00 -7.08266723e+02 -8.71069820e-02  9.23282091e-03
   2.69077473e+04]]
旋转向量:
 (array([[ 0.00393121],
       [-0.55572922],
       [ 0.00146949]]), array([[-0.24713914],
       [-0.62161368],
       [ 1.12164248]]), array([[0.03655035],
       [0.72426273],
       [0.58207192]]), array([[ 0.03267646],
       [-0.81493845],
       [ 0.33111165]]), array([[ 0.10136185],
       [-0.8188412 ],
       [ 0.0126507 ]]), array([[ 0.07815116],
       [-0.45667052],
       [ 0.04574239]]), array([[-0.06538785],
       [-0.45146705],
       [ 0.29559633]]), array([[0.19950015],
       [0.59439631],
       [1.05909245]]), array([[-0.61847323],
       [-0.65382223],
       [ 1.44780297]]), array([[-0.56075885],
       [-0.65910126],
       [ 1.21835979]]))
平移向量:
 (array([[-1.88349377],
       [-2.34826569],
       [79.07381781]]), array([[-3.71964945e-03],
       [-2.09696872e+00],
       [ 9.57830776e+01]]), array([[  2.82236969],
       [-10.16609008],
       [105.50710577]]), array([[  2.4498244 ],
       [ -9.91592803],
       [113.69245822]]), array([[  1.94032193],
       [ -9.41660327],
       [118.34213194]]), array([[  3.29323168],
       [-10.37799624],
       [150.0005035 ]]), array([[  1.90004234],
       [ -9.89181093],
       [136.81120801]]), array([[  3.81109485],
       [ -9.80118203],
       [131.55206487]]), array([[  0.12140321],
       [ -3.0523607 ],
       [114.3591686 ]]), array([[ 0.17173674],
       [-2.75540486],
       [80.26443015]]))
-----------------------------------------------------
校正后的图片已保存到文件 'undistorted.jpg'

Process finished with exit code 0

Imagen antes de la corrección de distorsión:

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

analizar:

Después de ejecutar el programa, calibré con éxito los parámetros de mi teléfono móvil y calculé los parámetros internos y externos de la cámara. A través de este experimento, entendí mejor las maravillas del método de calibración de Zhang Zhengyou. 

Supongo que te gusta

Origin blog.csdn.net/qq_44896301/article/details/130869103
Recomendado
Clasificación