1. 坐标系变换回顾

python 单目相机标定 畸变校正 单目相机标定方法_计算机视觉

  • 首先世界坐标系通过旋转、平移矩阵变换为相机坐标系
  • 相机坐标系通过相似三角形(小孔成像原理),将相机坐标系转换为图像坐标系,这里利用的其实就是相机的焦距。
  • 最好利用相机内参,将图像坐标系转换为像素坐标系。

相机标定

相机标定的目的是为了获得相机的内外参以及畸变参数。

相机标定的流程

python 单目相机标定 畸变校正 单目相机标定方法_角点_02


标定的过程

  • 1.打印标定板
  • 2.从不同角度对标定板进行拍摄
  • 3.用opencv接口检测标定板中的特征点(一般用的是方格,检测其角点)
  • 4.求理想无畸变情况下的内外参
  • 5.利用极大似然估计来迭代优化精度(用张正友标定法去求解内外参,其实是极大似然估计迭代求解的一个初始值,给定了初始求解参数,为了获取更精确的内外参需要用迭代法进行优化)
  • 6.利用最小二乘法求解径向畸变参数
  • 7.综合内外参、畸变参数,使用极大似然法,提升估计精度
  • 8 最好我们会计算得到相机的内外参和畸变系数

相机标定的trick

标定板图案
标定板图案我们一般用的是棋盘格,但我们其实不一定都要使用棋盘格,可以使用其他的图案。

  • 可以使用三维、二维,圆形,网格,随机图案。(如果用黑白棋盘格的话,检测角点会比较好检测;如果用的是圆形,它会检测圆心。Opencv这两种接口都有提供)
  • 一般选择使用平面物体的多个视角,而不是构造三维物体。

棋盘格角点个数和参数个数

  • 标定板的个数一般是越多越好,每张标定板的格子数多点。在不引入噪点的情况下
  • 总参数个数:四个相机内参($f_x,f_y,u_0,v_0$),5个畸变参数(k1~k3,p1,p2),3个旋转参数(每个坐标轴一个参数,能确定旋转矩阵),3个平移参数。
  • 假设棋盘格有N个角点,K个不同位置的图像
  • K个棋盘格提供2NK个约束,每个角点两个约束
  • 暂时忽略畸变参数:有4个内参,6个外参(在不同位置拍摄不同的图,旋转平移矩阵是不一样的,外参不相同)
  • 能够求解参数的前提: 2NK(约束) >6K +4,推出(N-3)*K>2 ,方程个数大于参数才可以求解
  • 单应性矩阵,通过4个点可以唯一确定,4个点便可以表达平面透视图,在4个方向伸展边
  • 不管棋盘格有多少个点,实际有用的只有四个有效的角点信息
  • K>1 ,至少需要拍摄两张棋盘格
  • 考虑到噪声和数值稳定性,需要使用更大的棋盘格,采集更多的图像
  • 为了更有效的效果,一般使用10张以上的,7*8或更大的棋盘格。采集更多的图,对这些图进行筛选,选择更有效的图片,对于噪声比较大的图像可以去掉。

如何评价相机的标定效果

评估重投影误差:
没有相机真实参数的情况下,评估相机标定的效果

  • 检测到的二维图像的角点,和真实世界的三维点的投影点之间的距离;
  • 使用标定得到的相机内外参,将三维世界点投影到像素坐标系中的二维点
  • 然后和算法检测到的二维图片的角点,计算均方误差RM
    我们会拿相机拍摄一张棋盘格,拍摄棋盘格会得到一张二维图像,二维图像上可以使用opencv的特征点检测算法,可以检测出二维图像的角点坐标A;另外,拍摄棋盘格我们知道它在世界坐标系的坐标,然后用我们求解到的相机内外参以及畸变参数,带到坐标矩阵变换中,通过计算求得棋盘格角点的坐标B。然后求解A,B的均方误差RMS
  • 平均的投影误差小于一个像素是可以接受的
  • 计算每张图的重投影误差,可以用来赛选去除误差较大的图片

    外参可视化
  • 以相机为中心点的标定板视图
  • 以标定板为中心的相机视图,对外参进行可视化
  • 相机固定,标定板移动,适合以相机为中心的视图
  • 反之,适合使用标定为中心的视图

观察畸变校正后的图片

-观察畸变矫正后的棋盘格,弯曲的线是否变直,适用于畸变比较明显的情况

python 单目相机标定 畸变校正 单目相机标定方法_opencv_03

如何改善相机标定的效果

  • 增加更多的图片
  • 标定板覆盖完全的图像,尤其是图像边缘、角点处畸变比较大的地方
  • 标定的图片需要足够的变化,不同角度,不同位置
  • 移除图片,对于噪声比较大的图片
  • 移除模糊的图片
  • 移除标定板相对于相机的倾斜度大于45度