利用ARToolkit对摄像头进行标定设ARToolkit应用首先要做的一步,详细内容可以参考官网教程Documentation里面的Calibrating your camera(http://www.hitl.washington.edu/artoolkit/documentation/usercalibration.htm)。
在进行摄像头标定之前需要建立ARToolkit的开发环境,具体的内容也可以参考官网教程Documentation里面的Setup ARToolkit(http://www.hitl.washington.edu/artoolkit/documentation/usersetup.htm),这里我们使用的是Windows 7 64位操作系统VS2010来实现的,按照教程中的步骤一步一步来实现,其中在64位系统中配置ARToolkit会遇到一些问题,可参考本人博客的前两则的内容(http://blog.csdn.net/qingyang8513/article/details/45192677和http://blog.csdn.net/qingyang8513/article/details/45195933),里面提供了详细的解决方法,下面是在上述内容完成之后进行的实验。
本部分内容只用于个人的学习记录与记录,详细内容请参考官方网站教程。
1、操作系统:Windows 7(64位)
2、编程环境:Microsoft Visual Studio 2010
3、ARToolkit版本:ARToolKit-2.72.1
ARToolkit程序默认的摄像机属性保存在摄像机参数文件camera_para.dat中,每次程序执行时都会读取文件的信息。而对于特定的摄像机,我们可以通过简单的摄像头标定技术产生单独的参数文件,当已知摄像头参数,ARToolkit程序就可以在运行时自动矫正摄像头畸变。
利用ARToolkit进行摄像头标定的方法有两种,一种是两部标定法,另一种是一步标定法。其中两部标定法相对复杂一点,但是精度会相对较高。
下面的两部分将分别采用这两种方法实现摄像头的标定。
1)标定板打印:patterns文件下打印calib_cpara.pdf和calib_dist.pdf,按照实际尺寸打印,前者是间距40mm网格,后者是6*4间距也为40mm的圆形标定点。打印出来的标定纸平整的固定在硬纸板上,如图一和图二所示。
图1 calib_cpara.pdf标定板
图2 calib_dist.pdf标定板
摄像机内部参数包括图像中心点坐标、镜头畸变参数和摄像机实际焦距,程序calib_dist用于测量图像中心点坐标和镜头畸变参数,而程序calib_cparam用于测量摄像机实际焦距。这两个程序保存在bin文件夹下,其中源文件保存在utils文件夹下。下面首先需要运行calib_dist,然后运行calib_cparam,因为calib_cparam用到了calib_dist程序输出的数据。
2)运行calib_dist:
a)运行calib_dist程序,使用图2所示的calib_dist标定板;
b)点击鼠标左键获取第一幅图像,保证保定板上的所有点都在图像坐标系中;
c)选取标定点:用鼠标按照从左到右、从上到下的顺序选取,选取时从标定点的左上角点击右键拉到右下角画一个方框,将标定点框在中间即可。如下图3、图4所示:
图3 获取第一幅图像
图4 选取标定点(从左到右,从上到下)
d)选定标定点的过程中可以使用鼠标右键从新选定;
e)选定一幅图像结束之后,点击鼠标左键重新获取一幅图像,按照b)~d)重复操作,建议3~5幅图像(越多也好);
f)选取结束之后,点击鼠标右键结束图像的选取,程序自动运行,并计算摄像头图像中心和畸变参数,这需要一段时间,同时程序界面会动态显示计算过程,如图5所示。
图5 图像中心和畸变参数计算过程
g)结束之后显示计算结果,如图6和图7所示;
图6 计算参数结果
图7 图像结果显示
h)查看所有结果后,程序结束,此时第一步完成。
3)运行calib_cparam:
a)使用calib_cparam标定板(7条水平线,9条垂直线);
b)运行calib_cparam,按照提示输入参数,其中用到了上一步计算出来的参数;
c)将标定板放在摄像头前面,保证和摄像头垂直;
d)点击鼠标左键,获取一幅图像,此时会出现一条白色的水平线,如图8所示;
图8 获取图像
e)使用键盘上下方向键移动中间白线,左右方向键调整白线角度,使白线和标定板最上面水平线重合,按下Enter键;
f)重复e),绘制所有7条水平线,顺序严格按照从上到下顺序;
g)水平线绘制完成后开始绘制垂直线,方法和上面类似,结果如图9所示;
图9 绘制网格线
h)完成之后,移动标定板远离摄像头100mm,重新获取图像,并重复上述过程,知道结束5幅图像的绘制;
i)标定结果如图10所示;
图10 实际焦距标定结果
j)输入文件名,保存标定参数,标定结束。
k)如果需要修改网格大小和一定距离,可以参考calib_cparam_sub.c,修改如下代码即可:
inter_coord[k][j][i+7][0] = 40.0*i;
inter_coord[k][j][i+7][1] = 40.0*j;
inter_coord[k][j][i+7][2] = 100.0*k;
*loop_num = 5;
一步标定法的方法和两部标定法第一步的方法相同,只需运行calib_camera2即可。
calib_cparam2
Input the length between each markers: 40
-----------
Mouse Button
Left : Grab image.
Right : Quit.
-----------
标定结束之后,即获得摄像头的参数文件,如果需要使用,只需要将文件名修改为camera_para.dat,并放在bin/Data文件夹下即可。