目录
【1】标定的相关介绍
【2】算法流程及相关算子简介
(1)算法流程主要有五部分:
(2)相关算子介绍
1.棋盘标定板查找角点
2.亚像素角点准确化
3.可视化角点
4.相机标定
5.误差计算
【3】完整代码
(1)标定的目的
在进行相机标定之前一定要搞清楚相机标定的目的,简单的说,相机标定主要是根据标定板在相机下的不同位置去求解出相机的内参和外参。内参是相机的固有属性,也就是说无论你标定板如何放置,你的相机固不固定,相机的内参不受影响,但是内参的准确性与标定板图像的个数有关,一般而言标定板放置的位置越全面,相机的内参越准确,误差越小。对于相机的外参而言,是世界坐标系相对于相机坐标系的空间变换(旋转矩阵和平移矩阵)。
(2)内参介绍
:单位毫米内X方向上像素的个数;
:单位毫米内Y方向上像素的个数;
、
:表示图像中心的x、y的坐标;
内参矩阵(3 x 3)如下图所示:
在实际应用中,使用的是远心镜头,在景深范围内,图像的视野大小一定,也就是说远心镜头不会发生畸变,而且内参是一定的,使用时候按照相机的参数配置即可。但对于普通相机,类似鱼眼镜头,使用时需要需要对内参进行校正,相机是否固定无所谓。
(3)畸变系数
畸变系数主要有5个参数:k1,k2,k3径向畸变系数,p1,p2是切向畸变系数。径向畸变发生在相机坐标系转图像物理坐标系的过程中。而切向畸变是发生在相机制作过程,其是由于感光元平面跟透镜不平行。径向畸变,即由于透镜的不同区域的焦距的不同而引起的畸变,分为枕形畸变和桶形畸变如下图所示,越靠近镜头边缘畸变越明显。形变如图所示:
(4)相机外参
相机的外参是世界坐标系在相机坐标系下的描述。R是旋转参数是每个轴的旋转矩阵的乘积,其中每个轴的旋转参数( ϕ , ω , θ ),平移参数( Tx , Ty , Tz ) ,矩阵为(4 x 4齐次矩阵)如下:
1.提取标定板的角点。
2.亚像素角点精确化。
3.可视化角点。
4.相机标定。
5.误差计算(重投影误差)。
第一个参数是传入的图像,该图像的类型是8UC1和8UC3。
第二参数是棋盘标定板标中内角点的个数(一行几个,一列几个),例如
第三个参数是用来记录查找的角点像素坐标
其数据类型是vector<point2f> 将一副图的角点坐标存入,对于多副标定板角点的存储是定义
vector<vector<point2f>>
第四个参数:
CALIB_CB_ADAPTIVE_THRESH = 1,通过自适应阈值法查找标定板;
CALIB_CB_NORMALIZE_IMAGE = 2,如果设置此标志,则在应用阈值之前使用CV::equalizeHist()来归一化图像; CALIB_CB_FILTER_QUADS = 4,当标定板图像存在畸变时,就会对四边形应用加以约束,防止出现错误的四边形;
CALIB_CB_FAST_CHECK = 8,对图像进行快速扫描,以确保图像中存在角点,如果不存在角点,则直接跳过此图像。
该算子的返回值是是否成功查找到角点。
(查找圆网格标定板于此类似,暂不介绍。)
2.亚像素角点准确化主要是两个算子cv::cornerSubPix和find4QuadCornerSubpix 二者参数一样。
img:输入的Mat矩阵,最好是8位灰度图像,检测效率更高; corners:初始的角点坐标向量,同时作为亚像素坐标位置的输出,所以需要是浮点型数据,一般用元素是Pointf2f/Point2d的向量来表示。
region_size:角点搜索窗口的尺寸,优化坐标时考虑的邻域范围。
对于角点的可视化算子是drawChessboardCorners。
image:需要绘制角点的目标图像,它必须是一个8位彩色图像。
patternSize:每张标定棋盘上内角点的行列数。
corners:检测到的角点坐标数组。
patternWasFound:绘制角点样式的标志,用于显示是否找到完整标定板。
patternWasFound=ture时,依次连接各个内角点。
patternWasFound=false时,以(红色)圆圈标记处角点位置。
calibrateCamera是相机标定的算子,具体函数如下:
第一个参数objectPoints,为世界坐标系中的三维点。在使用时,应该输入一个三维坐标点的向量的向量,即vector<vector<Point3f>> object_points。需要依据棋盘上单个黑白矩阵的大小,计算出(初始化)每一个内角点的世界坐标。
第二个参数imagePoints,为每一个内角点对应的图像坐标点。和objectPoints一样,应该输入vector<vector<Point2f>> 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,即vector<Mat>rvecs;
第七个参数tvecs为位移向量,和rvecs一样,应该为vector<Mat> 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,另外每张图像都会生成属于自己的平移向量和旋转向量。
返回值:重投影的均方根误差
5.误差计算重投影误差projectPoints,对标定结果进行评价的方法是通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到空间三维点在图像上新的投影点的坐标,计算投影坐标和亚像素角点坐标之间的偏差,偏差越小,标定结果越好。
第一个参数objectPoints,为相机坐标系中的三维点坐标;
第二个参数rvec为旋转向量,每一张图像都有自己的选择向量;
第三个参数tvec为位移向量,每一张图像都有自己的平移向量;
第四个参数cameraMatrix为求得的相机的内参数矩阵;
第五个参数distCoeffs为相机的畸变矩阵;
第六个参数imagePoints为每一个内角点对应的图像上的坐标点;
第七个参数jacobian是雅可比行列式;
第八个参数aspectRatio是跟相机传感器的感光单元有关的可选参数,如果设置为非0,则函数默认感光单元的dx/dy是固定的,会依此对雅可比矩阵进行调整;
代码运行显示为:
相关知识
利用OpenCV根据图片识别环境的亮度
如何实现一个高效的全景视频拼接系统?请详细描述从相机标定到颜色均衡处理的整个工作流程。
opencv
‘豆绿’牡丹的内参基因及其引物和应用
OpenCV实战项目——多种颜色识别
桂花金属离子胁迫下lncRNA内参基因和应用
深入浅出:利用OpenCV实现手写数字识别之旅
基于OpenCV的鲜花的图像分类系统详细设计与具体代码实现
白酒行业之酒鬼酒研究报告:内参酒鬼双驱动,高质量发展在途中
蕙兰内参基因的筛选与A类花发育基因的表达特性研究
网址: opencv 相机内参解释 opencv内参标定 https://m.huajiangbk.com/newsview1326552.html
上一篇: 养花不如养它,车厘子盆栽养殖方法 |
下一篇: 车厘子种植与管理技术(6)篇 |