OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述

  立体相机标定与校准对于需要获取深度信息应用场景的重要性不言而喻。

  双目视觉可通过两摄像头成像所产生的视差信息来确定现实世界中物体所在准确位置(三维坐标),如果双目未经过标定校准,其精度将会损失,甚至所获取深度的意义将会丧失。

  双目视觉系统经过校准后,现实世界中任一点或者物体在左右视图中应位于同一水平线上,即常说的极线对齐(epipolar alignment),一旦极线对齐后,只需要在同一水平线上对左右视图中的同一物体进行搜索匹配,得到视差信息后根据三角关系便可得到该物体在三维空间中的位置(坐标)。

1. 关于立体相机标定的操作流程

前提:OpenCV stereo_calib.cpp --> VS Solution is done.

代码框架:

int main(int argc, char** argv)
{
    Size boardSize;
    float squareSize;
    string imagelistfn;
    bool showRectified = true;
    ...
    vector imagesname;
    char *filePath = ".\\calibration image pairs";
    getFiles(filePath, imagesname);
    ...
    StereoCalib(imagesname, boardSize, squareSize, true, showRectified)
}

static void StereoCalib(const vector& imagelist, Size boardSize, float squareSizeTmp, bool useCalibrated=true, bool showRectified=true);
void getFiles(string path, vector& files);

> 获取标定图像对前,需在合适距离处调节lens(若可调)至最佳状态,即保证此处双目设备捕捉的棋盘格角点最为清晰;且在该距离时,棋盘格所占图像面积在30%-40%为宜;

> 获取标定图像对时,保证左右图像中的棋盘格完整出现,不断移动并调整棋盘格姿态,使其尽可能多的遍历双目设备所有视场范围内的区域;由于边缘畸变较大,应该尽量多获取边缘处的图相对;

> 获取标定图像对后,筛选合适数量满足条件的图像,最终用于标定的图像对应该大于20对为宜。

注意:

> 左图中的同一目标比右图中的同一目标偏右,即左右图命名不要弄反,与人眼视觉一致;

> 标定图像格式可为 bmp/png 等;

> 标定程序需指定棋盘格参数,附件1 棋盘格宽度 -w 9 高度 -h 6,真实物理边长 -s 为打印后的方格宽度。

OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述_第1张图片

1-1 棋盘格标定板与角点检测(角点检测是否精确至关重要)

OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述_第2张图片

1-2 立体标定校准后的图像对

OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述_第3张图片

1-3 立体标定均方根误差以及重投影误差(一般认为小于0.3pixel时,结果可接受)


2. 关于标定结果校准检验

前提: VS Rectification Solution is done.

代码框架:

int main()
{
    String extrinsic_filename = "extrinsics.yml";
    String intrinsic_filename = "intrinsics.yml";
    ...
    initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12);
    initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22);
    
    string imagelistfn = "imageList.xml";
    vector imagelist;
    bool ok = readStringList(imagelistfn, imagelist);
    ...
    remap(imgL, rimgL, map11, map12, INTER_LINEAR);
    remap(imgR, rimgR, map21, map22, INTER_LINEAR);
}
static bool readStringList(const string& filename, vector list);
> 将标定好的内外参文件(intrinsics.yml extrinsics.yml)放入工程目录下;

> imageList.xml文件内放入带校准的图像名,由于左右相机参数只能校准对应相机出图,故左右图顺序应放好;

> 输出生成校准后的图像,使用画图工具打开,可观察验证同一目标点是否处于同一水平线上。

其实,通过观察内外参文件里面部分参数指标即可大致验证标定的准确性,如果已知设备图像分辨率,焦距,基线距离等,可与下述参数进行对比验证:

OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述_第4张图片

2-1 立体标定内参外参文件与真实参数比较(真实的焦距 f = Focal length * Pixel size)


附件1. Calibration Chessboard: Size(9, 6)


你可能感兴趣的:(OpenCV立体相机标定Stereo Calibration与校准检验Rectification详述)