双目三维重建-1相机标定
目的
双目系统中存在两个相机,我们希望分别对两个相机进行标定,获取到每个相机的内参和畸变系数,那么我们就需要用相机拍摄一些标定板的图片。
为了同时标定另外一个相机,所以这些标定板的图像我们在另外一个相机也拍摄了
为了称呼简单一点,我们将相机1称呼为左相机
下面是右相机的图片
需要注意的是,两个相机的图片是同时拍的。
也就是说我拿着标定板 放在两个相机前面,然后两个相机同时拍摄了标定板的图片。
开始标定
打开祖传的pycharm设置好环境,然后开始敲代码
首先看我们用的棋盘格标定板,数一下它的角点,我们用的是11乘8的
准备三维点坐标数据
那么我们先把棋盘格标定板上的角点坐标给计算出来(三维点坐标哈,Z统一为0)
得到的三维点数据长这个样子
开始读图片
开始读图片了,我们把图片放在一个文件夹里面,然后用代码把图片读出来
用好glob,走遍天下都不怕
这样图片的路径都加载进来了,等下遍历这个对象获取到路径然后把图片读取进来就可以了
这里开始读图片进来,用的是imread函数
这个函数有个参数需要说一下,第一个参数是图片的路径,第二个参数可以设置灰度拉伸,或者读的彩色图转灰度图,或者保留其位深度啥的,这个参数需要注意
转灰度图
把读进来的图片转单通道灰度图
这个函数的第二个参数可选的有很多,常用的就这个
在图片上检测棋盘格的角点
这个函数需要输入棋盘格的尺寸,输错了就找不到角点
那么执行这个算子之后,会给到我们一堆二维像素点,这个就是代表找到的角点的位置
定位到角点,亚像素精确化(可选)
有一个操作就是我们初步定位到角点之后,在找到的角点周围再次定位一个更精确的角点位置,就是这个操作
这个算子第一个参数是输入的图片
第二参数刚才初步找到的角点
第三个参数就是一个窗口宽高,用于在之前找到的角点多大范围内再次确定更加精确的角点
第四个参数其实也是一个窗口宽高,只是这个窗口是用于排除这个精确角点的范围的,也就是这个窗口里面的位置,不考虑精确角点的位置。
第五个参数是一个终止条件
意思是角点位置相邻两次迭代变化量小于0.001像素或者迭代次数到达30次就停止迭代。
将找到的角点数据收集起来
放在一个集合里面,后续相机标定的时候需要用
单相机标定
这样就得到了双目系统中每个相机的内参和畸变系数,这些数据保存下来,后面的双目标定流程还会用到。