本文共 1303 字,大约阅读时间需要 4 分钟。
本文适用于初学者。
首先对概念要清晰:九点标定是点的仿射变换,只是图像行列、和坐标XY的仿射关系,也就是矩阵关系。从只有XY2个坐标轴来看,只有二个方向,所以只能适用于2D。下面具体流程:
第一步:制作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) 二值化提取黑或提取白
创建模板的相关算子
第二步:保持9个圆点不动,使用机械手的作业工具对准9个圆的圆心位置,并保存好机械手坐标。然后把9个点的坐标按照圆的序号在生成一个一维数组变量。(一定要对好序号,就是第一步中排序后的序号和数组元素一一对应)
第三步:使用图像行列的圆心和机械手的一维数组变量,生成一个矩阵关系。
vector_to_hom_mat2d (Column, Row, X, Y, HomMat2D) HomMat2D就是我们要的这个矩阵。
write_tuple (HomMat2D, 'D:/1012.tup') 保存矩阵使用
read_tuple ('D:/1012.tup', HomMat2D1) 读取矩阵使用
第四步:有矩阵了,就直接使用矩阵即可。(识别)使用相机去识别一个或多个新的物体,并得到行列中心,如何使用了镜像mirror_image,这里也必须使用镜像关系,就是图像要保持一致性。
affine_trans_point_2d (HomMat2D, Column1, Row1, Rx, Ry) 矩阵转换,把CR坐标转换为RxRy
第五步:很多人会认为第四步完成了,有一部分情况是没有问题。识别的物体的机械手位置不在抓取9个点的位置时,就不适用了,会偏的一塌糊涂。
Rxnew:=Rx+(当前X坐标-抓9点时X坐标)
*Rynew:=Ry+(当前Y坐标-抓9点时Y坐标)
这个公式适应所有,有很多人会分开和9点同位置和不同位置,完全没必要这么做,记好一个公式即可。
第六步:3个重点注意事项:
1.切记镜像mirror_image。前后一定要保持图片一致。
2.行列坐标和XY坐标,前后要保持一致。
3.圆的序号,行列序号一定要和定位XY序号保持一致。
转载地址:http://veezi.baihongyu.com/