常见问题汇总(持续更新中。。。20210705)
1.一般标定的时候有两种,一是Matlab工具箱,二是vs+opencv库,就准确度来说,由于matlab已经足够的智能化,又有人为参与点的标定,所以准确度较高!如果你是初学者,用matlab工具箱标定是最好的。
2.vs+opencv标定过程中,对于一个初学者肯定会出现很多问题。那么一定要检查一下这么几项:
a. 双目标定的棋盘格是否都出现在左右摄像机的视野?一定要保证棋盘格全部进入左右相机视野,这样才能正确建立两个相机的坐标关系
b. 双目相机在用stereocalibration进行标定前,利用calibrateCamera对左右单目相机分别标定。这样可以减小出差
c. 非常重要的一点!由于在vs+opencv中角点是自动检测的,所以,这个时候就会出现一个问题,“ 同一个位置下的棋盘格,通过角点提取的过程,需要牢记的是,左右相机标定的角点必须选择相同的的网格点和相同的原点(为了保证相同的模式参考系)。因此,确保相同的起源点(第一次点击)一直被选中是至关重要的。”。在有的棋盘格图像对中,你觉得两幅图像没多少区别,但是在程序自动选取角点过程中,起源点在不同的地方,这样会给最后立体标定带来严重错误,焦距、R、T都将会发生很大偏差。如图所示
d. 在利用stereocalibration标定过程中,其中的flags的赋值也需要注意,这个可以参考官网,或《学习opencv》这本书中的解释,其中参数设定不对,也会带来很大误差。
e. 采集棋盘图的时候要注意,尽量让棋盘占据尽可能多的画面,这样可以得到更多有关摄像头畸变方面的信息。
f. 在Matlab标定工具箱中,可以通过reproject on images,得到根据当前标定结果得到的反投影误差,从点云的聚集情况和分散的最大范围可以看出反投影误差的大小。Recomp. corners选项,主要完成根据反向投影得到的角点坐标重作为对角点的估计,重新计算角点的功能。针对第一次标定结果误差太大的情况,可以通过此方法重新计算角点。计算完成后,点击Calibration根据新的角点进行标定。此时,得到的标定信息,比第一次得到的反投影误差分布更集中,直径也小。(该步骤在标定过程中需谨慎使用,因为往往首次得到的三维坐标精确度并不高,如果参考误差较大的话,有可能使结果与正解偏差更大。)
g. 两个摄像头的焦距应该保持一致,因为在后续的视差图转换为三维图时的Q矩阵只有一个f值。所以必须要求至少焦距相近。而且立体成像的三角测量(Learning OpenCV书中提到)的前提假设就是fl=fr。(调整两个摄像头的焦距相同的方法:离两个相机相同远处放置标定板,分别调节两个相机的焦距,使得两个画面的清晰度相似。)
①双目标定的棋盘格是否都出现在左右摄像机的视野?
一定要保证棋盘格全部进入左右相机视野,这样才能正确建立两个相机的坐标关系。
在opencv官方程序中,findChessboardCorners()返回值可判断角点是否检测完整;排除;
②利用stereocalibration标定过程中,其中的flags的赋值也需要注意;
只要设置好值,这个影响不大,个人觉得;
③opencv棋盘格角点检测有两种顺序,逆时和瞬时;
因此,这里就会出现问题—同一位置下的棋盘格,通过角点提取过程,左右相机标定的角点必须选择相同的的网格点和相同的原点(为了保证相同的模式参考系)。因此,确保相同的起源点(第一次点击)一直被选中是至关重要的。
可以通过drawChessboardCorners将角点画出,判断左右图像对的角点顺序是否一致,
如果不一致,则会导致标定参数不准确;
【注】:
在有的棋盘格图像对中,你觉得两幅图像没多少区别,但是在程序自动选取角点过程中,起源点在不同的地方,这样会给最后立体标定带来严重错误,焦距、R、T都将会发生很大偏差。
参考文献
1.opencv双目标定常见问题总结
2. 双目标定
3. OpenCV:双目标定问题-内外参数,校正图像错误