calibrage de la caméra

1. Principe de calibrage de la caméra

1.1 Comment la caméra produit des images :

Le système d'imagerie de la caméra contient un total de quatre systèmes de coordonnées : le système de coordonnées mondiales, le système de coordonnées de la caméra, le système de coordonnées de l'image et le système de coordonnées des pixels.

1.1.1 Système de coordonnées mondial :
le système de coordonnées mondiales (coordonnées mondiales), également appelé système de coordonnées de mesure, est un système de coordonnées rectangulaires tridimensionnelles, sur la base duquel la position spatiale de la caméra et de l'objet à mesurer peut être décrite. . La position du système de coordonnées mondial peut être librement déterminée en fonction de la situation réelle.

1.1.2 Système de coordonnées de la caméra :
Le système de coordonnées de la caméra est également un système de coordonnées rectangulaires tridimensionnel. L'origine est située au centre optique de l'objectif. Les axes x et y sont respectivement parallèles aux deux côtés du plan de phase. L'axe z est l'axe optique de l'objectif et est aligné avec l'image. Plan vertical
1.1.3 Système de coordonnées de pixels, système de coordonnées d'image :

Le système de coordonnées de pixels (coordonnées de pixels)
est tel qu'illustré dans la figure ci-dessus. Le système de coordonnées de pixels est un système de coordonnées rectangulaires bidimensionnel qui reflète la disposition des pixels dans la puce CCD/CMOS de la caméra. L'origine est située dans le coin supérieur gauche de l'image et les axes et axes sont parallèles aux deux côtés du plan de l'image. L'unité de l'axe des coordonnées dans le système de coordonnées des pixels est le pixel (entier).

Le système de coordonnées des pixels n'est pas propice à la transformation des coordonnées, un système de coordonnées d'image doit donc être établi. L'unité de son axe de coordonnées est généralement le millimètre (mm). L'origine est l'intersection de l'axe optique de la caméra et du plan de phase (appelé le point principal), qui est le point central de l'image. Les axes et les axes sont respectivement parallèles aux axes et aux axes. Par conséquent, les deux systèmes de coordonnées sont en réalité dans une relation de translation, qui peut être obtenue par translation.

1.2 Le but de l'étalonnage de la caméra :
trouver les paramètres internes et externes de la caméra, ainsi que les paramètres de distorsion.

Après avoir calibré un appareil photo, vous souhaitez généralement faire deux choses : l'une est que, puisque le degré de distorsion de chaque objectif est différent, l'étalonnage de l'appareil photo peut corriger la distorsion de l'objectif et générer une image corrigée ; l'autre consiste à reconstruire l'image en fonction du image obtenue Construire une scène en trois dimensions.

1.2 Le principe général de l'étalonnage de la caméra :
l'étalonnage de la caméra (étalonnage de la caméra) est simplement le processus de passage du système de coordonnées mondial au système de coordonnées d'image, qui est le processus de recherche de la matrice de projection finale.

2. Étapes d'étalonnage de la caméra

1) Préparez un damier pour la méthode d'étalonnage de Zhang Zhengyou. La taille du damier est connue et utilisez un appareil photo pour le filmer sous différents angles afin d'obtenir un ensemble d'images ;

2) Détecter les points caractéristiques de l'image tels que les points d'angle de la carte d'étalonnage pour obtenir les coordonnées en pixels des points d'angle de la carte d'étalonnage. Sur la base de la taille connue du damier et de l'origine du système de coordonnées mondial, calculer la physique coordonnées des points d'angle de la planche d'étalonnage. ;

3) Résolvez la matrice des paramètres internes et la matrice des paramètres externes.

Selon la relation entre les valeurs de coordonnées physiques et les valeurs de coordonnées de pixel, calculez la matrice H, puis construisez la matrice V, résolvez la matrice B, utilisez la matrice B pour résoudre la matrice de paramètres interne de la caméra A, et enfin résolvez la matrice externe de la caméra. matrice des paramètres correspondant à chaque image :

4) Résolvez les paramètres de distorsion.

Construire la matrice D et calculer les paramètres de distorsion radiale ;

5) Utilisez l'algorithme LM (Levenberg-Marquardt) pour optimiser les paramètres ci-dessus

3. Mettre en œuvre
3.1 Préparation des données

Prenez des photos de la plaque d'étalonnage sous différents angles et obtenez 10 photos. Obtenez une image similaire à celle-ci.

3.2 Code (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'")

Le résultat est le suivant :

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

Image avant correction de la distorsion :

Image après correction de la distorsion :

analyser:

Après avoir exécuté le programme, j'ai réussi à calibrer les paramètres de mon téléphone portable et à calculer les paramètres internes et externes de la caméra. Grâce à cette expérience, j’ai mieux compris les merveilles de la méthode d’étalonnage de Zhang Zhengyou. 

Je suppose que tu aimes

Origine blog.csdn.net/qq_44896301/article/details/130869103
conseillé
Classement