九点标定在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,九点标定是点的仿射变换,只是图像行列、和坐标XY的仿射关系,也就是矩阵关系。从只有XY2个坐标轴来看,只有二个方向,所以只能适用于2D,并不是真正的手眼标定。
在大多数条件下这些参数必须通过实验与计算才能得到,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
1. 操作简单,方便快捷;
2. 计算简单,计算量少;
3. 对操作者水平要求不高,只懂二维仿射变换即可。
4. 几乎适用于所有2D平面的工业测量与视觉定位。
缺点:
1. 像素精度低,受人为操作影响较大;
2. 不能校正畸变与校正斜拍;
3. 不能求出相机的内参与外参;
4. 像素精度稍低,低于手眼标定的像素精度;
5. 只合适用于2D,不适用于3D。
使用九点标定时,影响机械精度的因素:
1. 相机倾斜发生变化;
2. 工作距离发生变化;
3. 测量物体厚度或变薄;
4. 用于标定点的数量;
5. 镜头发生畸变;
6. 像素精度不够。
l 第一步:制作9个点,相机采图的时候能全部拍到即可。一般以会3X3的行列相等去制作。
1.在图像上找到9个圆的中心坐标。(二值化提取区域后排序获得区域行列坐标/使用模板匹配后排序获得行列坐标)
2.会用到的一些算子:
rgb1_to_gray (Image, GrayImage) RGB图转灰度图
mirror_image (GrayImage, ImageMirror, 'row') 图像镜像,就是把9个点的序号按照自己习惯的方式在图像上显示。
illuminate (ImageMirror1, ImageIlluminate, 101, 101, 0.5) 图像亮度(灰度)不均匀时,使用这个算子平均一下图像灰度值。
scale_image (ImageIlluminate, ImageScaled, 42.5, -4080) 缩放图像,使黑白更分明。
binary_threshold (ImageScaled, Region, 'max_separability', 'dark', UsedThreshold) 二值化提取黑或提取白
connection (Region, ConnectedRegions) 连通域断开。
sort_region (ConnectedRegions, SortedRegions, 'character', 'true', 'row') 区域排序。
area_center (SortedRegions, Area, Row, Column) 获取区域的面积与重心行列。
l 第二步:保持9个圆点不动,使用机械手的作业工具对准9个圆的圆心位置,并保存好机械手坐标。然后把9个点的坐标按照圆的序号在生成一个一维数组变量。(一定要对好序号,就是第一步中排序后的序号和数组元素一一对应)
l 第三步:使用图像行列的圆心和机械手的一维数组变量,生成一个矩阵关系。
vector_to_hom_mat2d (Row, Column, X, Y, HomMat2D) HomMat2D就是我们要的这个矩阵。
write_tuple (HomMat2D, HomMatFile) 保存矩阵使用
read_tuple (HomMatFile, HomMat2D1) 读取矩阵使用
l 第四步:使用相机去识别一个或多个新的物体,并得到mark行列坐标,通过读取步骤三保存的矩阵,求出mark点的机械坐标。
affine_trans_point_2d (HomMat2D, Row1, Column1, Rx, Ry) 矩阵转换,把行列坐标转换为RxRy。
l 第五步:补偿偏差,即当前拍照位置与标定拍照位置的偏差。
RxNew := Rx + (当前拍照X坐标 – 标定拍照时X坐标)
RyNew := Ry + (当前拍照Y坐标 – 标定拍归时Y坐标)
l 第六步:3项重点注意事项:
1. 切记镜像mirror_image。前后一定要保持图片一致。
2. 行列坐标和XY坐标,前后要保持一致。
3. 圆的序号,行列序号一定要和定位XY序号保持一致。