双目相机的标定 python_六个步骤完成双目相机的标定,这么看来也不是很难嘛...

机器视觉之halcon入门(40)-双目相机的标定

双目相机的标定 python_六个步骤完成双目相机的标定,这么看来也不是很难嘛..._第1张图片

一个相机看到的是一张图像,只有二维信息,要想获取空间物体的三维信息,有一种常用的一种方法是:模拟人眼,用两个相机,就是所谓的双目相机。用相机总是少不了标定。

单个相机的标定,就是获取相机的内参、外参(之前有一个章节详细说过)。双目的标定是默认已经知道两个相机的内参,只

标定外参:即两个相机之间的姿态关系。

以halcon例程binocular_calibration为例:

首先,根据图片大小设定两个窗口:

双目相机的标定 python_六个步骤完成双目相机的标定,这么看来也不是很难嘛..._第2张图片

例程里面是在路径中读取图片,也就是说,如果你要双目标定,在固定好相机姿态后,写一个小demo,在相机视野内分别抓取15张左右的标定板照片。

第二步:读取标定板信息和生成相机的内参

9b76467a7909f7d93704f02702ec3ac4.png

Caltab_points():顾名思义就是获取标定板上的点,第一个参数就是标定板的路径,后面三个参数是标定板上的点的坐标信息。单步执行到这里可以在变量窗口看到,默认的原点是标定板的中心点,XYZ正方向都是标定板默认的。

Gen_cam_par_area_sacn_division():这个算子的意思是,生成一个相机内参的数组,其实就是把相机的一些参数改成halcon里面的内参格式。例程里面默认左右两个相机内参一样。

第三步:设置一些参数和空变量,这些都是为第四步服务的,具体含义,第四步再说

双目相机的标定 python_六个步骤完成双目相机的标定,这么看来也不是很难嘛..._第3张图片

第四步:循环读取标定板图片,求出每一张图片上标定板圆点中心的坐标,并根据这些计算出标定板相对于相机的位姿

双目相机的标定 python_六个步骤完成双目相机的标定,这么看来也不是很难嘛..._第4张图片

因为两个相机,所有很多算子都是执行了两次。

Find_caltab():就是找到标定板的意思。第一个参数是找标定板的图片,第二个参数是输出参数,就是输出找到的标定板的区域,第三个参数是标定板文件,第四五六个参数是你设定的找这个标定板区域的一些参数。这个算子是怎么找到标定板区域的呢?首先,它把图片高斯滤波一下,第四个参数就是用来给定高斯滤波参数的(即高斯滤波的模板尺寸)。然后有一步是阈值筛选,第五个参数就是用来设定阈值筛选的阈值的,就是你的标定板白色部分和黑色圆点的阈值分水岭。然后又有一步是要根据筛选后的region面积进行筛选,第六个参数就是设定最小的圆点的直径。这些参数在第三步都设置好了,这里直接调用即可。这三个参数设的准了,每张照片就都可以准确的找到标定板的区域。

然后再从区域里面找到标定板上每个圆点的坐标,再根据这些坐标与第二步里面标定板的坐标之间的关系,标定出相机的外参(这一步基本雷同于单目相机的标定,只是它只标定外参,不标定内参,因为内参你已经设定了的嘛)。执行这一步就是下面这个算子了:

find_marks_and_pose (ImageR, CaltabR, CaltabFile, StartCamParR, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoordR, CCoordR, StartPoseR)

参数超级多,意思就是找到标定板上各个圆点的坐标和相机相对于标定板的位姿。第一个参数就是照片,第二个参数是利用上面那个算子找到的标定板区域,第三个参数是标定板文件,第四个参数是相机的内参(第二步里面已生成);第五到第十个参数,描述起来太复杂,总是它们都是这个算子找到标定板上圆点的所需要的一些参数,用的时候如果发现找不到,就调下参(虽然没有机器学习里面调参niubility)。调参原则是startThresh,MaxDiamMarks这两个一点一点放大,DeltaThresh,MinThresh,MinContLength这三个参数一点一点缩小,Alpha这个参与越小,图像会平滑的越厉害,那你就看情况平滑了。最后三个参数就是输出的各个圆点的横纵坐标,和这个相机的姿态了。

到这儿的时候,我们有必要再好好理一下思路了。对于一个标定板的一个姿态,我们用两个相机分别拍摄了一张照片,然后根据这张照片我们分别计算出了相机的外参。其实就是相机与标定板之间的位姿关系。所以:左相机与标定板的位姿关系已知,右相机与标定板的位姿关系已知,所以左相机和右相机的位姿关系可求,也就是已知!但是我们拍摄了十几组的照片,其实也就是获取了十几组这些数据,事实上,单目的标定也是获取了十几组数据。那接下来的步骤就很明确了:根据这十几组数据,计算出左相机和右相机的位姿关系!

就是厉害的第六步了:

binocular_calibration (X, Y, Z, RowsL, ColsL, RowsR, ColsR, StartCamParL, StartCamParR, StartPosesL, StartPosesR, 'all', CamParamL, CamParamR, NFinalPoseL, NFinalPoseR, cLPcR, Errors):这一步就是双目标定最核心的一步了!它会输出两个相机的内参(CamParamL, CamParamR),刚刚用于标定的那十几组照片里面标定板分别与左右相机之间的位姿关系(NFinalPoseL, NFinalPoseR),以及根据这些拟合出来的右相机相对于左相机的位姿关系( cLPcR),和这次标定的平均误差(Errors)。至于它内部是怎么把十几组数据拟合成一组答案,怎么线性回归、梯度下降,怎么矩阵相乘,实在是不太需要去钻研。我们只要把它需要的参数丢给halcon就行了。就是前面的12个参数,前五步的目的其实也就是为了求出这些参数。如果到这一步你还能看懂,那这些参数的含义相信就不用我多说了,填进去就可以了。

这样双目标定就算大功告成啦!!

当然,这个例程里面还有一步:

gen_binocular_rectification_map ()。唉,下次再说吧~~谢谢阅读!

你可能感兴趣的:(双目相机的标定,python)