Halcon学习-单相机标定和手眼标定

1. 单相机标定

为了得到二维平面像素坐标和三维世界坐标的关系,从而进行三维重建,必须进行单相机标定。

  • 应用场景:畸变校正、一维和二维物体测量。
  • 基本参数
  1. 相机内参:相机的固有属性,在进行畸变校正时需要用到相机的内参。
  2. 相机外参:物体在经过透镜成像之后,实际上是经过了旋转和平移,而外参就是告诉我们物体成像后经过了那种旋转和平移,相机的外参包括平移矢量和旋转矩阵。
  3. 畸变参数:采用理想针孔模型,由于通过针孔的光线少,摄像机曝光太慢,在实际使用中均采用透镜,可以使图像生成迅速,但代价是引入了畸变。有两种畸变对投影图像影响较大: 径向畸变和切向畸变。
  • 四个基本坐标系
    四个坐标系,即图像像素坐标系 (u,v)、图像物理坐标系(x,y)、相机坐标系(Xc,Yc,Zc)和 世界坐标系(Xw,Yw,Zw)(标定板所在的坐标系)。
    在这里插入图片描述
  1. 像素坐标系(u,v)与CCD的图像物理坐标系(x,y)的关系
    像素坐标系不利于坐标变换,因此需要建立图像物理坐标系XOY,其坐标轴的单位通常为毫米(mm),原点是相机光轴与相面的交点(称为主点),即图像的中心点。X轴、Y轴分别与u轴、v轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。
  • 两坐标互相垂直
    在这里插入图片描述
    此时有:
    在这里插入图片描述
    其中,dX、dY分别为像素在X、Y轴方向上的物理尺寸,u0,v0为主点(图像原点)坐标。
    : 这里引用了齐次矩阵(就是将一个原本是2维的x,y向量用一个3维向量(加个1)来表示),引入齐次矩阵的目的主要是合并矩阵运算中的乘法和加法,表示为x=P*X的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。
  1. 相机坐标系(Xc,Yc,Zc)与图像坐标系(x,y)的关系
    根据小孔成像原理:
    在这里插入图片描述
    如图,空间任意一点P与其图像点p之间的关系,P与相机光心o的连线为oP,oP与像面的交点p即为空间点P在图像平面上的投影。

    该过程为透视投影,根据三角形相似性原理得如下矩阵:
    在这里插入图片描述
    其中,s为比例因子(s不为0),f为有效焦距(光心到图像平面的距离),(x,y,z,1)T是空间点P在相机坐标系oxyz中的齐次坐标,(X,Y,1)T是像点pp在图像坐标系OXY中的齐次坐标。
  2. 世界坐标系(Xw,Yw,Zw)至相机坐标系(Xc,Yc,Zc)的关系
    在这里插入图片描述
    其中:R为3* 3的旋转矩阵,T为3*1的平移矩阵,(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T为世界坐标系的齐次坐标。
  3. 世界坐标系转化为像素坐标系
    在这里插入图片描述
    在这里插入图片描述
    其中,M1称为相机的内部参数矩阵,完全由相机的内部参数ax,ay,uo,vo决定,(uo,vo)为主点坐标,ax,ay分别表示图像u轴和v轴的尺度因子;M2完全由摄像机相对于世界坐标系的方位决定,称为摄像机的外部参数;Xw为空间点在世界坐标系下的齐次坐标;M为一个3*4的矩阵,称为投影矩阵。
    总结:其实说白了,我们需要找到世界坐标系和像素坐标系之间的关系,而两者的关系可以通过将世界坐标系转化为相机坐标系,相机坐标系通过投影变换转化为CCD的图像物理坐标系,在通过变换可以把图像物理坐标系的物理单位转化为图像像素坐标系的像素单位[即(x,y)→(u,v)],从而得到世界坐标系和像素坐标系之间的关系,即通过A->B,B->C,C->D之间的关系,找到A->D的关系。
    要想找到世界坐标系到像素坐标系之间的转换关系,必须要求出相机内参,外参,而标定就是求相机内外参的过程,通过求得的内外参,达到对成像物体的一、二维测量和畸变矫正的目的。

2. 标定流程

实现的原理是根据相机的像元尺寸、焦距和标定板的描述文件(.descr)来找到显示的标定板图像上面的标志点,从而确定标定板实际输入的参数(Distance、Diameter等)和这些参数对应的图像像素大小的关系,完成标定。
这里我用的标定板是7*7圆点标定板,型号:HC070—3.75,也可自行打印(.ps)文件。
在这里插入图片描述
标定板数据可参考:
在这里插入图片描述
标定步骤:

  1. 使用gen_caltab算子生成一个标定文件
    生成标记文件的算子:
    gen_caltab (
    7, x方向的标记数;
    7, y方向的标记数;
    0.0075, 标记点圆心之间的距离,单位:米;
    0.5, 标记点直径与标记点圆心之间距离的比值;
    ‘caltab.descr’,标定板的描述文件的保存路径;
    ‘caltab.ps’,描述标定板的一些信息,打印标定板时会用到)
  2. 打开标定助手,加载标定文件,设置相机参数(单个像元宽高(问相机厂商或看手册),相机焦距)
    在这里插入图片描述
  3. 实时获取各个角度、位置的标定板图片(9-16张左右),并选择其中一种图片设置参考位姿,然后标定。
    在这里插入图片描述
  4. 保存相机内、外参,下次使用测量助手直接调用内外参文件。
    在这里插入图片描述
  5. 进行畸变校正
    在这里插入图片描述
    代码:
*相机内参
CameraParameters := [0.0375147,-270.806,8.30152e-006,8.3e-006,647.48,520.914,1280,960]
*相机位姿,即外参(旋转矩阵+平移矢量)
CameraPose := [-0.0091626,-0.00625214,0.700967,2.46926,358.933,179.443,0]
*1、校正径向畸变,得到新的相机内参
change_radial_distortion_cam_par ('adaptive', CameraParameters, 0, CamParamOut)
stop ()
 * Image Acquisition 02: Code generated by Image Acquisition 02
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'CAMERA_QBY_DM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
    grab_image_async (Image, AcqHandle, -1)
    *2、对发生径向畸变的图像生成投影映射,图像的映射数据存在第一个参数中
    gen_radial_distortion_map (Map, CameraParameters, CamParamOut, 'bilinear')
    *3、对图像进行畸变校正
    map_image (Image, Map, ImageMapped)
endwhile
close_framegrabber (AcqHandle)

注意:相机标定之后,相机焦距、上下位置不能再动,否则需要重新标定。

3. 实战

  • 打开测量助手,加载上面得到的相机内、外参。
    在这里插入图片描述

  • 进行快速测量,可以看到最后测量结果24.1232mm。
    在这里插入图片描述

4. 手眼标定

  • 获得9点的像素坐标
  1. 手画或用PS绘制9点图片
    在这里插入图片描述
  2. 利用Blob分析获取9点坐标
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', 8, 'gray', -1, 'false', 'default', 'c42f90f4615e_Hikvision_MVCA05020GM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
    * 1.采集
    grab_image_async (Image, AcqHandle, -1)
    * 2.预处理
    rgb1_to_gray (Image, GrayImage)
    * 3.分割
    threshold (Image, Regions, 21, 68)
    connection (Regions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, ['area','circularity'], 'and', [458.72,0.8798], [16972.5,1])
    * 按照字符行排序
    sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
    * 4.中心点计算
    area_center (SortedRegions, Area, Row, Column)
    
endwhile
close_framegrabber (AcqHandle)
  • 获得9点的在机械手下的实际坐标
    保持位姿不变,移动机械手到9个点的正上方,记录下TCP所在的位置,x,y置依次存储到变量Column1,Row1中。
  • 求出映射矩阵
vector_to_hom_mat2d(Column,Row,Column1,Row1,HomMat2D)
  • 用HomMat2D把像素坐标转换为机械手坐标进行抓取
* Row2,Column2为blob分析后得到的目标像素坐标
* Qx,Qy 为通过映射矩阵得到的机械手坐标
affine_trans_point_2d(HomMat2D,Row2,Column2,Qy,Qx)

参考:Halcon 单相机标定

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值