一、标定概述

单目相机标定的主要目标是计算相机的内参和外参。内参包括焦距、主点坐标和畸变系数,用于描述相机的光学特性;外参包括旋转矩阵和平移向量,用于描述相机在世界坐标系中的位置和方向。通过标定,可以消除图像中的畸变,并将图像坐标转换为世界坐标,实现更为精确的视觉测量和三维重建。

二、标定方法

单目相机标定通常使用棋盘格标定板进行。首先,将标定板放置在相机视野内,并从不同角度和位置拍摄多张包含标定板的图像。然后,通过图像处理算法,检测这些图像中的角点位置,并计算这些角点在世界坐标系中的对应位置。接下来,利用这些对应关系,使用标定算法(如张正友标定法)求解出相机的内参和外参。

三、标定步骤

1.准备工作:

在均匀光照条件下,将棋盘格标定板固定在不同位置,并使用单目相机拍摄多张包含标定板的图像。确保标定板在图像中有足够的角点被检测到,并且这些图像覆盖了不同的视角和位置。

2.角点检测:


使用开源计算机视觉库(如OpenCV)中的角点检测算法,提取每张图像中的棋盘格角点坐标。这些角点坐标将作为标定算法的输入数据。


3.标定计算:

将提取的角点坐标和对应的世界坐标输入标定算法,计算相机的内参。常用的标定算法如张正友标定法,可以在OpenCV中方便地实现。

四、源代码

import cv2
import numpy as np
import glob

#设置棋盘格参数
w_grid = 12    #棋盘格宽方向上的格数
h_grid = 9     #棋盘格高方向上的格数
block_width = 25 #棋盘格单个格子的宽度 (单位 mm)

#设置用于校准图片地址,其中图片为jpg格式存储在calibration文件夹中
images_path = glob.glob('./calibration/*.jpg')  # 加载拍摄的棋盘格图片文件地址

# 找棋盘格角点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) # 阈值
w = w_grid-1
h = h_grid-1

objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
objp = objp*block_width

# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 存储在世界坐标系中的三维点
imgpoints = [] # 存储在图像平面的二维点

for fname in images_path:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
#调用opencv相机校准函数
ret, mtx, dist, rvecs, tvecs = \
    cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
print("相机内参:\n",mtx)      # 内参数矩阵
print("畸变系数:\n",dist   )   # 畸变系数

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐