1. 标定板
上图来源于https://zhuanlan.zhihu.com/p/24305610。
标定板的长宽不能一样,否则旋转区分不了。
- 1棋盘格
检测边缘的交点作为角点,精度低,因为实际的棋盘格标定板的边缘存在过滞带,不是直接的由白瞬间变黑。
棋盘格校准要求图片必须拍全,因为Opencv的角点检测,要求整个棋盘格必须在所有图像中可见。
- 2aruco
好提取,但精度没有提升。
Aruco模块主要基于 ArUco library,是一个二维码识别中被广泛使用的库。
一个ArUco标记外围都有一组黑色边框,同时内部有着确定该标记ID的二维矩阵组合而成。黑色的边框能加速标记在图像中的检测速度,内部的二维编码能唯一识别该标记,同时进行错误检测和错误修复。标记的大小确定了内部矩阵的大小,例如4x4大小的标记有16个bit(5x5就有25bits?)。
Some examples of ArUco markers:
aruco采用2D图像计算深度信息,需要提前在程序中输入标记物的宽度,根据识别标记物在图像中的像素数量与实际宽度的比值即可计算出深度等信息。
以上内容,引用自https://blog.csdn.net/zjpp2580369/article/details/100119590。
- 3charuco
上图来源于https://blog.csdn.net/zhy29563/article/details/119039163
Chessboard具有高的交点精度,但是交点提取比较困难。ArUco能够快速检测,但即使使用亚像素精度提取,提取的交点精度也不甚理想。ChArUco集成了Chessboard的高精度与ArUco易用性的优点。
- 4圆形校正板
算圆心,理论上角点比棋盘格等准,但存在偏心误差(斜着看是椭圆),opencv提供的提取函数没有算偏心误差。
校正偏心误差思路:先不管偏心误差做标定然后用单应矩阵把标定板转正,再做一次标定,迭代几次。
2. 内参标定
2.1 张正友标定
张正友标定适用于针孔模型相机,不适用于鱼眼模型的相机。
张正友标定是利用固定棋盘格的方式进行标定。其将世界三维坐标系固定在棋盘格上,每个格子的大小是固定已知的,则我们可得到每一个角点在世界坐标系下的物理坐标(X,Y,0),同时每个角点在图像坐标系下的像素坐标也是已知的。根据以上两个已知条件,来求解相机的内参、外参、畸变系数(具体的公式推导这里就不讲述了,网上有详细的推导过程),先求解内参,再求解外参,最后求解畸变系数。
求解方法:一张图片四个特征点,就可以求出单应矩阵。单应矩阵为内参和外参的混合体,然后利用旋转矩阵正交的特性,分解出内参 最少三张图片。
当标定板图片的个数大于3时(事实上一般需要15到20张标定板图片)可采用最小二乘拟合最佳的内参。从单应矩阵中要分解出内参,就必须要大于等于3张图片。
世界三维坐标系固定在棋盘格上,外参矩阵反映的是标定板和相机的位置关系,对于不同的图片,标定板和相机的位置关系已经改变,此时每一张图片对应的外参矩阵都是不同的。而我们真正需要求解的外参是机器坐标系与相机坐标系的转换关系,这部分需要用手眼标定的方法进行外参求解。
需要注意的一点是,张正友标定法仅仅考虑了畸变模型中影响较大的径向畸变。
以上给出了标定的理论可行性。实际的标定一般都是用最小二乘法进行参数拟合,求出最优解。标定时,一般拍摄图片15到20张,每张图片中标志物尽量占据画面1/4以上,不同标定板角度尽量存在一个相对明显的旋转和平移。
张正友标定的详细推导过程请查看如下文章https://zhuanlan.zhihu.com/p/136827980。
2.2 标定方法
实际标定的计算步骤主要分为两步,(1)初始化参数 (2)进行最小二乘法优化参数。
针孔模型标定:
a 先求出各个标定板的单应矩阵。 标定板任意四个角点,解方程给出单应矩阵初值。然后多个角点,构建重投影误差,最小二乘法优化单应矩阵。
b 求解内参,外参。任意三个标定板,解方程给出内参初值。然后多个标定板,最小二乘法优化内参。内参求出后,解出各个标定板的外参。
c 重投影误差评定结果。
以上没考虑畸变,实际标定,构建重投影误差,最小二乘法求解内参,外参,畸变系数。注意每个标定板外参不一样。
3. 外参标定
眼在手上的手眼标定。
对于 Eye-in-hand 手眼标定方式,需要求解工业机器人的末端坐标系与相机坐标系之间的坐标转换关系。 Eye-in-hand 手眼标定的原理示意图如图 1所示。这其中有几个坐标系, 基础坐标系(用 base 表示) 是机器臂的基底坐标系,末端坐标系(用 end 表示) 是机器臂的末端坐标系, 相机坐标系(用 cam 表示) 是固定在机器臂上面的相机自身坐标系,标定物坐标系(用 cal 表示)是标定板所在的坐标系。任意移动两次机器臂,由于标定板和机器臂的基底是不动的,因此对于某个世界点,其在 base 坐标系和 cal 坐标系下的坐标值不变,在 end 坐标系和 cam 坐标系下的坐标值随着机器臂的运动而改变。根据这一关系,可以求解出end坐标系和 cam 坐标系之间的转换矩阵。具体求解过程如下。
Opencv4.5支持了手眼标定。
4. 实际项目中的应用
产线上,往往只拍一张图片,就要完成内参的校准。这张图片包含多个棋盘格。角点提取算法需要知道角点属于那个棋盘格。一张图片多个棋盘格角点的分割方法。主要三步,粗提取,亚像素提取,生长的方法。具体方法请参阅如下文章https://blog.csdn.net/electech6/article/details/52770010,开源算法位于https://www.cvlibs.net/software/libcbdetect/。
对于棋盘格提取,matlab的鲁棒性比opencv的高。棋盘格角度倾斜过大部分角点会提取失败,尽量使棋盘格能够铺满图像。边缘区域通常是很好的信息来源,因为它们适当的约束了镜头失真模型。
内参效果,内参看反畸变图像边上直线是否直(有毛刺没有做插值)。
外参的标定,需要在特定的工作台上进行。机器固定在工作台上,工作台驱动机器做特定旋转平移,每个姿态拍一张棋盘格图像。利用眼在手上的手眼标定原理,构建最小二乘法,求解外参。