1.环境依赖
本算法采用张正友相机标定法进行实现,内部对其进行了封装。
环境依赖为 ubuntu20.04 + opencv4.2.0 + yaml-cpp
yaml-cpp安装方式:
(1)git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地
(2)进入下载目录中,mkdir build && cd build #构建build文档
(3)cmake .. #使用cmake构建
(4)sudo make install #安装yaml-cpp
仓库下载:
bash
git clone https://gitee.com/BingbingSuperEffort/calibration.git
2.使用方式
使用cmake构建执行文件
bash
mkdir build && cd build && cmake.. && make
编译的可执行文件为Calibration,使用时运行该文件并配备图片文件夹路径作为参数,该文件夹内部为相机拍摄的不同角度与不同高度的棋盘照片。
使用示例:./Calibration ./test-jpg
3.配置文件
配置文件为config.yaml
内部包含如下配置:
(1)chess_row,chess_col
棋盘格行列个数:该参数表示相机标定使用的黑白棋盘格的行和列上的方格个数,请确保行列正确
(2)square_size
棋盘方格大小:该参数表示每个黑白方格的长度数值
(3)image_path
读取文件路径记录名:该参数为读取的含有棋盘的具体图片的路径名称记录,可以查阅本次标定具体使用了哪些图片,参数以弃用,不在输出路径记录文档。
(4)image_suffix
图片名称后缀:该参数表面在文件夹中查找哪种类型的图片参数,支持jpg与png格式,参数以弃用。内部将直接搜索文件夹中.jpg.png格式的所有图片
(5)camera_matrix_file
输出文件名:该参数指定了yaml格式的输出文件,文件内部包含测定后的内参数的具体数值
(6)output_detail
是否输出更详细的数据参数:默认为false,不输出更详细的参数,设置为true将输出每张图片的像素误差,以及整体误差等详细的参数,会将结果保存到camera_result_detail.txt 文件中
(7)camera_type
标定相机的具体类型,CV为普通相机,FISHEYE为鱼眼相机
(8)downsample
是否降采样采取角点,处理像素高的照片速度快,像素低可能会检测不到角点,导致评定失败,默认为true
(9)show_draw
是否显示角点绘制过程,默认为false,在处理大文件时应当关闭,避免卡死
(10)undistort
是否对图像实现畸变矫正,并显示矫正后的效果,默认为false
(11)test_image_path
实现畸变矫正的测试图片路径,仅在undistort为true时有效
4.输出文件
image_path.txt 测定的具体图片的名称路径
camera_matrix.yaml 相机内参数fx,fy,cx,cy,畸变系数k1,k2,p1,p2,p3(或者k1,k2,u1,u2),图片长宽。
camera_result_detail.txt 相机测定具体的数值,包含每幅图片的标定误差,总体平均误差,每幅图像的畸变系数。只有在配置文件中设置才会输出该文件。
5.标定流程
6.文件介绍
各个文件简要说明:
main.cpp
:主要为接口函数,以及一些接口参数的设置。编译成为可执行文件后,在使用时传入测定图片的文件夹路径
CCalibration
类实现摄像机标定功能,calibration.run()
执行读取标定板图片、角点检测、亚像素精确化、摄像机标定、计算重投影误差、保存标定参数功能;
CUndistort
类实现畸变校正功能,undistort.run()
执行读取内部参数、读取畸变图像、畸变校正、显示校正结果功能。执行时默认不进行畸变校正,如需打开请在config.yaml中将undistort参数设置为true。
calibration.h, calibration.cpp
:实现摄像机标定,包含CV模型和Fisheye模型。默认为CV模型,如需更换为Fisheye模型,请在config.yaml中将camera_type参数设置为FISHEYE。
undistort.h, undistort.cpp
:实现畸变校正,包含CV模型和Fisheye模型。如需更换为Fisheye模型,请在config.yaml中将camera_type参数设置为FISHEYE。
7.使用函数
1.findChessboardCorners()
角点提取函数。
函数功能:
该函数的功能就是判断图像内是否包含完整的棋盘图,如果能够检测完全,就把他们的角点坐标按 顺序(逐行,从左到右)记录下来,并返回非0数,否则返回0。 这里对size参数要求非常严格,函数必须检测到相同的size才会返回非0,否则返回0。
函数原型:
cpp
bool cv::findChessboardCorners ( InputArray image,
Size patternSize,
OutputArray corners,
int flags = CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE
);
参数介绍:
image
输入的棋盘格原图。必须是8位灰度图或者彩色图像
patternSize
棋盘格图片的每一行每一列的内角点数
corners
输出检测到的角点阵列
flags
标志位,默认为0
2.find4QuadCornerSubpix()
亚像素角点提取函数
函数功能:
该函数的目的是提高角点检测的精度,特别是当使用亚像素精度进行定位时。在图像中,四角形的角点可能因为各种因素(如图像噪声、模糊等)而不完全清晰。find4QuadCornerSubpix() 函数通过在角点附近进行更细致的搜索,来提高角点的定位精度。
函数原型:
cpp
bool cv::find4QuadCornerSubpix(InputArray image,
InputOutputArray corners,
Size region_size);
参数介绍:
img
输入图片矩阵
corners
初始的角点坐标
region_size
角点搜索窗口大小
3.drawChessboardCorners()
角点绘制函数
函数功能:
该函数的主要作用是帮助用户直观地展示检测到的棋盘格角点位置,以便于调试和验证。
函数原型:
cpp
void cv::drawChessboardCorners(InputOutputArray image,
Size patternSize,
const Mat& corners,
bool patternWasFound);
参数介绍:
image
cv::Mat& 类型,这是要在其上绘制角点的输出图像。函数执行后,图像上会显示棋盘格的角点。
patternSize
cv::Size& 类型,这是一个 cv::Size 结构,表示棋盘格的内部角点数。
corners
const std::vector<cv::Point2f>& 类型,这是一个包含棋盘格角点坐标的向量。这些坐标通过角点检测算法(如 findChessboardCorners())获得。
patternWasFound
bool 类型,一个布尔值,指示棋盘格模式是否被成功检测。如果 true,角点将被绘制;如果 false,角点将不会被绘制。
4.calibrateCamera()
相机标定函数
函数功能:
该函数用于相机标定,即确定相机的内参和(可选)外参。相机内参包括焦距、主点坐标和畸变系数,而外参则包括相机相对于某一特定坐标系的位置和旋转
函数原型:
cpp
double cv::calibrateCamera ( InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints,
Size imageSize,
InputOutputArray cameraMatrix,
InputOutputArray distCoeffs,
OutputArrayOfArrays rvecs,
OutputArrayOfArrays tvecs,
int flags = 0,
TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON)
);
参数介绍:
objectPoints
一系列角点的三维坐标。
imagesPoints
角点投影到标定图案平面上的二维坐标点。
imageSize
图片的尺寸大小,用以初始化相机内参。
cameraMatrix
相机的内参矩阵。
distCoeffs
相机的畸变参数矩阵,有5个畸变参数:k1,k2,p1,p2,k3
rvecs
旋转向量
tvecs
平移向量
flags
表示标定时采用的算法,默认为0
criteria
迭代的终止条件,通常忽略
5.projectPoints()
重投影函数
函数功能:
根据相机的内参(焦距和主点坐标)和畸变系数,将三维点转换为图像上的二维点。对计算结果进行评定。
函数原型:
cpp
void cv::projectPoints ( InputArray objectPoints,
OutputArray imagePoints,
InputArray rvec,
InputArray tvec,
InputArray K,
InputArray D,
double alpha = 0,
OutputArray jacobian = noArray()
);
参数介绍:
objectPoints
对象点的数组
imagesPoints
若干张图片对应的若干的内角点的坐标
rvecs
旋转向量
tvecs
平移向量
K
内参矩阵
D
畸变矩阵
alpha
偏斜系数
jacobian
是否计算雅可比矩阵