OpenCV:双目标定问题-内外参数,校正图像错误
1、以matlab标定结果为标准:
一般标定方法有两种,分别是matlab标定和opencv标定;
就准确度和稳定性来说,matlab标定优于opencv标定;
但opencv标定较灵活,可以自己修改程序;
常常采用matlab2016a,输入命令stereoCameraCalibrator,进行双目标定;
将标定结果转置之后,输入到opencv中使用;
则matlab标定结果如下:


2、将上述棋盘格图像经opencv官方标定程序,
输入参数:
argc = 6;
argv[0]="calibrator.exe";
argv[1]="-w";
argv[2]="8";
argv[3]="-h";
argv[4]="6";
argv[5]="stereo_calib.xml";//图像序列
square_size=28.0f;//棋盘格真实尺寸,单位mm
之后,标定参数结果出错,校正图像错误,如图所示:


3、问题分析:
先从输入量开始分析,
主要输入量为:argv[1]="-w";argv[2]="8"; argv[3]="-h"; argv[4]="6"; argv[5]="stereo_calib.xml";//图像序列
square_size=28.0f;//棋盘格真实尺寸,单位mm,
其中,
①"-w";"8";"-h";"6"为棋盘格内角点;
如图所示:
可见棋盘格内角点输入正确,排除此项;
②square_size=28.0f;//棋盘格真实尺寸,单位mm,
也正确;
因此,只有图像序列中出现问题;

4、图像角点分析:
因matlab能正确得出相机参数,故图像本身不存在问题;
问题或许在图像角点检测中,
①双目标定的棋盘格是否都出现在左右摄像机的视野?
一定要保证棋盘格全部进入左右相机视野,这样才能正确建立两个相机的坐标关系。
在opencv官方程序中,findChessboardCorners()返回值可判断角点是否检测完整;排除;
②利用stereocalibration标定过程中,其中的flags的赋值也需要注意;
只要设置好值,这个影响不大,个人觉得;
③opencv棋盘格角点检测有两种顺序,逆时和瞬时;
因此,这里就会出现问题—同一位置下的棋盘格,通过角点提取过程,左右相机标定的角点必须选择相同的的网格点和相同的原点(为了保证相同的模式参考系)。因此,确保相同的起源点(第一次点击)一直被选中是至关重要的。
可以通过drawChessboardCorners将角点画出,判断左右图像对的角点顺序是否一致,
如果不一致,则会导致标定参数不准确;
【注】:
在有的棋盘格图像对中,你觉得两幅图像没多少区别,但是在程序自动选取角点过程中,起源点在不同的地方,这样会给最后立体标定带来严重错误,焦距、R、T都将会发生很大偏差。


5、通过将上述图像序列中角点提取顺序不一致的图像删除,或者重新采集;
再由opencv双目标定程序执行,
得到结果,如下:


6、在opencv双目标定中,
一般采用单目与双目结合的方法,
这样可以提高相机标定的稳定性,有利于减小误差;
