本人最近做视觉定位项目,眼在手外,使用了halcon4点标定(其实3点就行了,因为3个不共线的点可以确定一个平面。另外,如果4点标定结果精度够的话,完全不必要9点标定),这里分享一下:
一、首先说一下为什么要标定以及标定的作用是什么:
1、什么情况需要相机标定?
除非单相机的视角(FOV)小于20mm,或者系统精度要求几个mm,否则都要做。
很多初学者,都对标定概念模糊不清,分不清坐标系之间的关系,搞不清相机标定和机械手相机标定有什么关系,本文给大家解释。
我们通常所说的相机标定分为两种,一种是相机参数的标定,这一般用到张氏标定法,标定的作用是校正相机自身的畸变,利用校正得到的参数对图形进行处理后再呈现出来。关于这方面的资料,网上大把,我也不再此说明。一般的机械手定位也不会进行这个标定,因为现在的相机畸变还是很小的,精度可以满足大多数要求。
本文要介绍的是第二种,相机和机械手之间的标定,作用:建立相机坐标系和机械手坐标系之间的关系,即给机械手装上眼睛,让它去哪就去哪。
常用的标定方法是9点标定。采用9点标定是因为点数越多越精确,但也不是越多越好,因为点数越多标定也会越麻烦,所选取的9个点在相机中间不要太靠近边缘,能够照顾到要定位的点即可。
2、本质就是仿射变换,一个坐标系转换到另一个坐标系;
3、最少三个不同线的点,理论上点越多越好,例如九点标定就有一定的拟合作用,能够减少部分误差,例如由于机械安装或者相机旋转倾斜带来的误差;精度可做到0.05mm;
二、再来看看我的4点标定,重点就是vector_to_hom_mat2d算子:
*初始化矩阵 pxX := gen_tuple_const(4, 0) pxY := gen_tuple_const(4, 0) mmX := gen_tuple_const(4, 0) mmY := gen_tuple_const(4, 0) *像素坐标 pxX:=[2609, 2529, 677, 568] pxY:=[368, 2262, 2102, 385] *机械坐标 mmX:=[74.53, 76.53, 131.07, 134.556] mmY:=[68.498, 124.3, 119.69, 69.116] *[不推荐]根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放 vector_to_similarity (pxX, pxY, mmX, mmY, HomMat2D_Not) *[推荐]根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切 *Approximate an affine transformation from point correspondences. vector_to_hom_mat2d (pxX, pxY, mmX, mmY, HomMat2D) *已知仿射变换矩阵,倒推计算仿射变换参数 *根据仿射变换矩阵(齐次二维变换矩阵)计算仿射变换参数 *Compute the affine transformation parameters from a homogeneous 2D transformation matrix. *HomMat2D (输入参数):仿射变换矩阵 *Sx (输出参数):x方向的缩放因子(如果从图像空间变换到物理空间,就是x方向的像素单量) *Sy (输出参数):y方向的缩放因子(如果从图像空间变换到物理空间,就是y方向的像素单量) *Phi (输出参数):旋转角度 *Theta (输出参数):斜切角度 *Tx (输出参数):沿x方向平移的距离 *Ty (输出参数):沿y方向平移的距离 hom_mat2d_to_affine_par (HomMat2D, Sx, Sy, Phi, Theta, Tx, Ty) *弧度转换角度 tuple_deg (Phi, DegPhi) tuple_deg (Theta, DegTheta) *保存矩阵 write_tuple (HomMat2D, 'd:\\1.tup') *读取矩阵 read_tuple ('d:\\1.tup', HomMat2D) *利用像素坐标计算出机械坐标 Row := [0, 3664, 3664, 0, 3664/2] Column := [0, 2748, 0, 2748, 2748/2] affine_trans_point_2d (HomMat2D, Row, Column, Qx, Qy) stop()
其中的算子hom_mat2d_to_affine_par就是通过仿射变换矩阵,倒推计算得出若干参数。
三、遇到的问题:加工过程,相机需要移动怎么办?
http://www.ihalcon.com/read-16036.html
具体场景如下:
1、相机安装在机械手上方,安装在导轨上,但相机不是固定不动的,它可以沿着X方向移动,工作时需要移动到A,B,C三个点分别拍摄。
2、机械手在相机下方,可以X和Y方向移动。
3、理论上相机的X导轨和机械手X轴是平行关系,但是实际安装时,机械难免有误差。
我现在把相机停靠在A点,拍照,然后使用4点标定得到了仿射变换矩阵M1。
问题是:相机停靠在B点和C点时,是否还需要分别进行4点标定??还是说有更简便的方法,直接使用A点得到的矩阵M1?那在B点和C点怎么使用这个M1呢?
答:在B点位置拍照,先用老矩阵M1算出(x,y),然后得出实际机械坐标值为(x+B-A,y)。说明白了就是平移而已。
---
眼在手外的参考文献
http://www.ihalcon.com/read-13820-1.html