利用opencv棋盘格标定法对鱼眼图像校正分析

利用opencv棋盘格标定法对鱼眼图像校正分析
一、开发环境

PC端、vs2013+opencv3.0、摄像头为淘宝购置的鱼眼摄像头外设+iphone6

 

二、镜头标定

 

1.  输入畸变的棋盘格图以及棋盘格的size(横纵坐标上的角点个数)

该图片中棋盘格的size为(15,10)

利用opencv棋盘格标定法对鱼眼图像校正分析_第1张图片

 

2.  提取棋盘格角点 findChessboardCorners

 

§   二值化

将输入的图像从color转化为gray的灰度图。

 

§   CheckChessboard

 

判断图片中是否有chessboard。具体方法是将输入图像经过腐蚀Erode和膨胀Dilate操作,分别检测黑色以及

白色正方形格子的数量是否为棋盘格width/2*height/2,如果符合,那么就能简单的确认输入图片是一 张带有棋盘

格的图像。

§   GenerateQuads

生成方格轮廓contour。对于输入图像,先做dilate膨胀操作。之后做findcontour操作,遍历每一个轮廓,如果

该轮廓为方格并且其两个对边的长度都相近,那么将这个方格push到结果中,这些方格即是棋盘格中的小正方形。

§   FindQuadNeighbors

寻找方格的相邻方格。将前一步生成的方格输入,对于每一个方格,都遍历所有的方格,计算相邻的方格定点

的距离,并且找到最近距离的方格,将该方格记做是当前方格的相邻方格。经过了膨胀之后原来相邻的点从一个变

成了两个,现在将这两个点用一个点来替代,这个点就是膨胀之前的两个方格的公共交点。

§   FindConnectedQuads

寻找相互连接的方格。遍历所有的方格,如果该方格有相邻的方格并且它还没有被归类,则将这个方格归在一

个新的group中,之后再考察当前方格的相邻方格,如果相邻方格的相邻方格没有被归类,那么再将新的方格加入

group中,最终,group中包含了所有互相连接的方格。

§   OrderFoundConnectedQuads

将方格排序。将所有的相互连接的方格进行排序,考察每一个方格的相邻方格的个数,并且通过角点的坐标是

否在一直线上,可以考察每一个方格位于哪一列哪一行,返回的方格序列以左上角的为首,顺时针排序。

§   CleanFoundConnectedQuads

剔除多余的方格。如果发现上一步排序后的方格数量超过了我们输入的棋盘格size的width*height,那么就需要

将一些不符合要求的方格剔除。我们需要找到的是最小的方格,如果当前四个角点组成的方格可以用更小的四个角

点组成的方格替代,那就将大的那个方格剔除。一直循环直到方格的数量等于我们提供的棋盘格size中方格的数量。

§   CheckQuadGroup

检查最终的方格。从一个只有一个相邻方格的方格开始检查,将所有的方格相连的角点位置进行一个更加精确

的确定。

§   CheckBoardMonotony

检查方格是否水平平齐。对于每一行和每一列中所有的角点,考察该角点是否投影在该行或者该列的首位点所

形成的线段上,以最终确保棋盘格方格提取的正确性。

§   FindCornerSubPix

找出亚像素角点。对于最终提取出来的方格,找到其亚像素的精确角点,返回这些角点。

利用opencv棋盘格标定法对鱼眼图像校正分析_第2张图片

上图为标出角点之后的图像

 

3.  鱼眼标定

鱼眼相机的内参数采用Matx33d保存,具体矩阵形式如下:

利用opencv棋盘格标定法对鱼眼图像校正分析_第3张图片

鱼眼相机的畸变系数是一个四维的向量,用Vec4d保存,具体形式如下:

                            {k1,k2,k3,k4}

利用calibrate标定函数,即可以将上述的鱼眼相机内参数以及畸变系数都求出来。

标定分为三个步骤:

    外部参数标定CalibrateExtrinsics

优化Optimization

确认Validation

 

§  外部参数标定CalibrateExtrinsics

首先初始化外部参数值InitExtrinsics,紧接着计算这些外部参数的值ComputeExtrinsicRefine(利用雅克比矩阵

不断迭代运算,最终得到平移矩阵,旋转矩阵和旋转向量)。

§  优化Optimization

反复调用外部参数标定CalibrateExtrinsics,直到所有的参数都达到最优化。

§  确认Validation

利用不确定性评估EstimateUncertainties,得到误差参数,如果误差参数控制在一定的范围内,则确认通过。

最终返回Matx33d表示鱼眼相机内参数和Vec4d表示畸变系数。

 

 

三、畸变校正

1.  初始化未畸变的校正图initUndistortRectifyMap。

利用opencv棋盘格标定法对鱼眼图像校正分析_第4张图片

 

上述公式为透镜畸变前后图像坐标变换的公式。

     initUndistortRectifyMap完成了畸变前后的对应关系:

1. 由图像坐标系反变换到相机坐标系中

2. 然后,校正反变换R-1,一般无校正变换的相机,默认为单位矩阵

3. 归一化,并进行相机透镜畸变处理

4. 由相机坐标转换到图像坐标。

由此,得到由图像模型到透镜畸变模型相互变换的对应关系u <->mapx, v <-> mapy。

    在相机标定过程中的Matx33d表示鱼眼相机内参数和Vec4d表示畸变系数与公式中对应。

2.  校正remap

利用上一步得到的mapx和mapy的对应关系,将鱼眼畸变图形通过remap校正回正常的图片。 利用opencv棋盘格标定法对鱼眼图像校正分析_第5张图片

 

 

四、校正流程框图

利用opencv棋盘格标定法对鱼眼图像校正分析_第6张图片

 

五、校正效果测试

利用opencv棋盘格标定法对鱼眼图像校正分析_第7张图片

利用opencv棋盘格标定法对鱼眼图像校正分析_第8张图片

 

利用opencv棋盘格标定法对鱼眼图像校正分析_第9张图片

利用opencv棋盘格标定法对鱼眼图像校正分析_第10张图片

 

源码链接:https://share.weiyun.com/5YV5eSV

你可能感兴趣的:(利用opencv棋盘格标定法对鱼眼图像校正分析)