Calibration相机内参数标定

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);

参数介绍:

imagecv::Mat& 类型,这是要在其上绘制角点的输出图像。函数执行后,图像上会显示棋盘格的角点。

patternSizecv::Size& 类型,这是一个 cv::Size 结构,表示棋盘格的内部角点数。

corners const std::vector<cv::Point2f>& 类型,这是一个包含棋盘格角点坐标的向量。这些坐标通过角点检测算法(如 findChessboardCorners())获得。

patternWasFoundbool 类型,一个布尔值,指示棋盘格模式是否被成功检测。如果 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是否计算雅可比矩阵

相关推荐
passer__jw7671 小时前
【LeetCode】【算法】3. 无重复字符的最长子串
算法·leetcode
passer__jw7671 小时前
【LeetCode】【算法】21. 合并两个有序链表
算法·leetcode·链表
sweetheart7-72 小时前
LeetCode22. 括号生成(2024冬季每日一题 2)
算法·深度优先·力扣·dfs·左右括号匹配
小于小于大橙子2 小时前
视觉SLAM数学基础
人工智能·数码相机·自动化·自动驾驶·几何学
景鹤4 小时前
【算法】递归+回溯+剪枝:78.子集
算法·机器学习·剪枝
_OLi_5 小时前
力扣 LeetCode 704. 二分查找(Day1:数组)
算法·leetcode·职场和发展
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
风影小子5 小时前
IO作业5
算法
奶味少女酱~5 小时前
常用的c++特性-->day02
开发语言·c++·算法
passer__jw7675 小时前
【LeetCode】【算法】11. 盛最多水的容器
算法·leetcode