Opencv 相机内参标定及使用
一、功能描述
1.本文用于记录通过 Opencv 进行相机内参标定和对内参的使用来进行图像畸变矫正。
1)相机矩阵:包括焦距(fx,fy),光学中心(Cx,Cy),完全取决于相机本身,是相机的固有属性,只需要计算一次,可用矩阵表示如下:[fx, 0, Cx; 0, fy, cy; 0,0,1];
2) 畸变系数:畸变数学模型的5个参数 D = (k1,k2, P1, P2, k3);
3)相机内参:相机矩阵和畸变系数统称为相机内参,在不考虑畸变的时候,相机矩阵也会被称为相机内参;
4) 相机外参:通过旋转和平移变换将3D的坐标转换为相机2维的坐标,其中的旋转矩阵和平移矩阵就被称为相机的外参;描述的是将世界坐标系转换成相机坐标系的过程。
二、标定板制作
方法一: 标定板可以直接从opencv官网下载:标定板
方法二:Matlab DIY 制作
1 | J = (checkerboard(300,4,5)>0.5); |
打印完成后,测量实际打印出的网格边长,备用(本人制作的标定板网格边长为 26mm)。将打印纸贴附在硬纸板上(粘贴的尽可能平整),如下图所示。
三、图像采集
运行以下参考程序按q键即可保存图像,注意尽量把镜头的每个方格都覆盖到,最好拍到整张打印纸。保存大约20到25张,通过 Matlab 标定软件可能会剔除部分图片。
1 |
|
四、标定内参
方法一:Matlab标定
步骤1:在Matlab的Command Window里面输入cameraCalibrator即可调用标定应用程序。
步骤2:选择from file 在自己的图片集全选待标定的图片,输入自己实际测量打印的标定板方格实际长度(本人的标定板方格边长26mm),导入后我的有2张图片被拒绝。
步骤3:关键步骤
畸变参数,总共有五个,径向畸变3个(k1,k2,k3)和切向畸变2个(p1,p2)。
径向畸变:
实验表明,在MATLAB中选择使用三个参数,并且选择错切和桶形畸变,关于三个参数还是两个参数,可以根据自己的试验效果选择 。点击 Calibrate 后等待一段时间即可完成标定,标定完成后可通过点击 show Undistorted 对比校正前后效果。
右上角平均误差推荐在0.5以下时,表明该标定数据可信(本人此次平均误差为0.47 )。
步骤4:导出参数,即可把参数进行保存,保存后可退出标定应用,在MATLAB主界面中将保存的Mat文件打开。
步骤5:记录、保存数据
上图中,RadialDistortion对应k1,k2,k3,TangentialDistortion对应p1,p2。
IntrinsicMatrix对应相机矩阵,注意具体数值和OpenCV中数据是互为转置的关系。
此次本人测得的数据为:
方法二:C++程序标定
简单粗暴直接上程序:
1 |
|
运行上述程序,经过一番图片处理与切换,最终通过终端得到获取相机内参及畸变系数。
五、使用内参
简单粗暴直接上程序:
1 |
|
测试效果如下:
Ref
Python+OpenCV实现相机标定的方法详解_python_脚本之家
双目相机标定+去畸变+获得视差+深度(一次解决所有问题)(python+openCV)_双目相机视差怎么解决-CSDN博客