且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Halcon标定系列(5):4点标定之眼在手外项目实践,已知仿射变换矩阵,计算得到旋转角度和缩放因子等参数

更新时间:2021-11-06 18:51:09

本人最近做视觉定位项目,眼在手外,使用了halcon4点标定(其实3点就行了,因为3个不共线的点可以确定一个平面。另外,如果4点标定结果精度够的话,完全不必要9点标定),这里分享一下:

Halcon标定系列(5):4点标定之眼在手外项目实践,已知仿射变换矩阵,计算得到旋转角度和缩放因子等参数



一、首先说一下为什么要标定以及标定的作用是什么:


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