相机标定(一)

您所在的位置:网站首页 _findfirst函数 相机标定(一)

相机标定(一)

2023-03-28 07:59| 来源: 网络整理| 查看: 265

相机标定(一)——内参标定与程序实现 white_Learner 分类:机器视觉 发布时间 2020.05.29阅读数 11325 评论数 0

相机标定(一)——内参标定与程序实现

相机标定(二)——图像坐标与世界坐标转换

相机标定(三)——手眼标定

 

一、张正友标定算法实现流程 1.1 准备棋盘格

备注:棋盘格黑白间距已知,可采用打印纸或者购买黑白棋盘标定板(精度要求高)

 

 

1.2 针对棋盘格拍摄若干张图片

此处分两种情况

 

标定畸变系数和相机内参,拍摄照片需要包含完整棋盘,同时需要不同距离,不同方位,同时需要有棋盘不同倾斜角度。 标定畸变系数,相机内参和相机外参,图片包含上述要求,同时标定程序生成结果中每张照片会计算一个相机外参数因此根据实际需求,增加几张棋盘在工作位置的照片。(相机外参建议采用solvePnP函数获取)

 

1.3 检测图片中的内角点 角点检测

 

bool findChessboardCorners(InputArray image, Size patternSize, OutputArray corners, int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE )

 

image,传入拍摄的棋盘图Mat图像,必须是8位的灰度或者彩色图像; patternSize,每个棋盘图上内角点的行列数,一般情况下,行列数不要相同,便于后续标定程序识别标定板的方向; corners,用于存储检测到的内角点图像坐标位置,一般用元素是Point2f的向量来表示:vector image_points_buf; flage:用于定义棋盘图上内角点查找的不同处理方式,有默认值。

 

提取亚像素角点信息

(1)cornerSubPix

 

void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria)

 

img,输入的Mat矩阵,最好是8位灰度图像,检测效率更高; corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector iamgePointsBuf; winSize,搜索窗口边长的一半,例如如果winSize=Size(5,5),则一个大小为的搜索窗口将被使用。 zeroZone,搜索区域中间的dead region边长的一半,有时用于避免自相关矩阵的奇异性。如果值设为(-1,-1)则表示没有这个区域。 criteria,角点精准化迭代过程的终止条件。也就是当迭代次数超过criteria.maxCount,或者角点位置变化小于criteria.epsilon时,停止迭代过程。

 

该函数通过迭代法查找角点亚像素精度下的精确位置,函数实现流程如下:

 

 

(2) find4QuadCornerSubpix

 

bool find4QuadCornerSubpix(InputArray img, InputOutputArray corners, Size region_size);

 

img,输入的Mat矩阵,最好是8位灰度图像,检测效率更高; corners,初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示:vector iamgePointsBuf; region_size,角点搜索窗口的尺寸;

 

1.4 相机标定

 

double 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,为世界坐标系中的三维点。在使用时,应该输入一个三维坐标点的向量的向量,即vector object_points。需要依据棋盘上单个黑白矩阵的大小,计算出(初始化)每一个内角点的世界坐标。 imagePoints,为每一个内角点对应的图像坐标点。和objectPoints一样,应该输入vector image_points_seq形式的变量; imageSize,为图像的像素尺寸大小,在计算相机的内参和畸变矩阵时需要使用到该参数; cameraMatrix为相机的内参矩阵。输入一个Mat cameraMatrix即可,如Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0)); distCoeffs为畸变矩阵。输入一个Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))即可; rvecs为旋转向量;应该输入一个Mat类型的vector,即vectorrvecs; tvecs为位移向量,和rvecs一样,应该为vector tvecs; flags为标定时所采用的算法。有如下几个参数: CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,u0,v0的估计值。否则的话,将初始化(u0,v0)图像的中心点,使用最小二乘估算出fx,fy。 CV_CALIB_FIX_PRINCIPAL_POINT:在进行优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中心或者某个输入的值。 CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只将fy作为可变量,进行优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx和fy将会被忽略。只有fx/fy的比值在计算中会被用到。 CV_CALIB_ZERO_TANGENT_DIST:设定切向畸变参数(p1,p2)为零。 CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6:对应的径向畸变在优化中保持不变。 CV_CALIB_RATIONAL_MODEL:计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。 criteria是最优迭代终止条件设定。

 

在使用该函数进行标定运算之前,需要对棋盘上每一个内角点的空间坐标系的位置坐标进行初始化,默认参数下生成的标定的结果为相机内参矩阵cameraMatrix、相机的5个畸变系数distCoeffs,另外每张图像都会生成属于自己的平移向量和旋转向量。

 

1.5 结果评价

对标定结果进行评价的方法是通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到空间三维点在图像上新的投影点的坐标,计算投影坐标和亚像素角点坐标之间的偏差,偏差越小,标定结果越好。

 

空间的三维点进行重新投影计算

 

void projectPoints( InputArray objectPoints, InputArray rvec, InputArray tvec, InputArray cameraMatrix, InputArray distCoeffs, OutputArray imagePoints, OutputArray jacobian=noArray(), double aspectRatio=0 );

 

objectPoints,为相机坐标系中的三维点坐标; rvec为旋转向量,每一张图像都有自己的选择向量; tvec为位移向量,每一张图像都有自己的平移向量; cameraMatrix为求得的相机的内参数矩阵; distCoeffs为相机的畸变矩阵; iamgePoints为每一个内角点对应的图像上的坐标点; acobian是雅可比行列式; aspectRatio是跟相机传感器的感光单元有关的可选参数,如果设置为非0,则函数默认感光单元的dx/dy是固定的,会依此对雅可比矩阵进行调整;

 

1.6 保存结果

保存结果有两种格式。

 

txt用于查看结果。

 

//保存定标结果 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3