创建标定数据模型
你可以用算子create_calib_data创建一个标定数据模型,指定相机和标定物体的数量。当用一个相机的时候,你也用一个单独的标定物体。
然后,你要做的是:
- 指定相机内部参数的初始值
- 描述标定物体
指定相机内参的初始值
你可以用算子set_calib_data_cam_param来设置相机内部参数。
除了标定数据模型,算子也需要下面的参数作为输入:
- CameraIdx:相机的索引(0代表单个相机)
- CameraType: 相机的类型
- CameraParam: 相机内参初始值的一个元组
那种畸变模型去使用
对于面阵相机,两种畸变模型可供使用:划分模型和多项式模型。划分模型用一个参数来构造径向畸变,多项式模型用5个参数来构造径向和离心畸变。
划分模型的优势是畸变可以被快速的应用,尤其是对于反向畸变,例如如果世界坐标被映射到图像平面。还有,如果只有几张标定图像被使用或者视野覆盖不足,划分模型则会比多项式模型得到更稳定的结果。多项式模型的主要优势是它可以更精确的构造畸变,因为其用了更高阶的项去构造径向畸变,并且它也构造了离心畸变。需要注意的是,多项式模型不能够反推。因此,反向畸变必须被迭代计算看,其要比划分模型反向畸变的计算要慢。
一般的,划分模型应该被用来标定。如果标定的精度不高,可以用多项式模型。但是需要注意的是,被用于多项式模型的标定序列必须提供一个完整的区域覆盖,这个区域在后边用于测量。畸变可能会在没有被标定板覆盖的区域外边被不准确的构造出来。这种情况发生在图像边缘,也发生在标定板没有覆盖到的视野区域内部。
描述标定物体
用算子set_calib_data_calib_object,你可以指定标定物体所需的信息。
如果你用的是HALCON的标定板,对应的描述文件名字就足够了。
如何获得一个合适的标定板
确定给CCD相机的相机参数最简单的方法就是利用HALCON的标定板(如图1所示)。在这种情况下,找标定把的整个过程,提取标定标志点,以及决定提取标定标志点和各自3D世界坐标之间的对应关系都可以自动的被执行。更重要的是,标定板更加精确,1um或更小,对于高精度的应用其是前提条件。
两种类型的HALCON标定板是被支持的。尤其是,六角形排列的标志点和矩形排列的标志点的标定板是可行的。具有六角形排列的标定板是在HALCON12中引进的,在大多数应用中被推荐使用,因为相比于矩形排列标志点的标定板,其提供了如下的优点:
l 具有矩形排列标志点的标定板应该充满图像视野的四分之一。为了覆盖包括不同倾斜的整个视野,许多图像(至少10到20)是需要。因为六角形排列的标定板包含了众多数目的标志点,因此用单个图像就能够覆盖整个图像面积,更少的图像(6到7张)被需要去得到可比较的标定 结果。
l 矩形排列标志点的标定板必须在图像全部可见的,然而六角形排列的标定板可以伸出图像的边缘。进而,当放置标定板的时候,后者就不需要太多的在意。标定板图像的获取就变的更快和方便,而没有稳定性的损失。
一个六边形排列的标定板在单张图像上应该充满整个图像区域。一个矩形排列的标定板应该至少覆盖图像区域的9分之一。为了提高标定的质量,我们推荐一个标定板至少覆盖图像区域的四分之一。
图1:不同材质和尺寸的HALCON标定板:(a)六角排列的标志点(b)矩形排列的标志点
使用你自己的标定物体
利用HALCON,你不受限于使用一个平面标定板,例如HALCON标定板。你可以使用一个3D标定板或者甚至任意特征点(自然的标志)。仅有要求就是模型点的3D世界位置是已知的,并且具有很高的精度。
然后,你就简单将标定物体的所有点(标志点)的3D坐标作为一个元组传到算子set_calib_data_calib_object中的CalibObjeDescr。所有点的x, y, z坐标必须以【x, y, z】元组的顺序进行打包。
然而,需要主要的是,如果你用自己的标定物,你就不能再用find_calib_object。相反,你必须自己来确定模型点的2D位置和对3D点的对应关系。