Halcon学习笔记——摄像机标定(1)

本文详细介绍了相机标定的过程,包括创建标定文件、查找标定板、执行标定及测试步骤。通过gen_caltab函数初始化标定参数,find_calib_object函数查找图像中的标定板,calibrate_cameras进行相机标定。测试阶段,利用get_calib_data获取标定后的相机参数,并进行图像点到世界坐标的转换,计算两点间距离,验证标定效果。
摘要由CSDN通过智能技术生成

文章目录

创建

  • gen_caltab (7, 7, 0.00375, 0.5, ‘caltab.descr’, ‘caltab.ps’)
  • 首先创建标定文件 根据所用的标定板的款式输入不同的参数 前两个参数分别是X,Y轴两个方向上的点数,第三个是中心距单位mm 第四个为小圆点直径与中心距的比例 例如我用的中心距3.75mm 小圆直径1.875mm 则第四个参数填0.5 运行之后的descr文件之后会用到 ps文件可以查看
  • StartCamPar := [0.016,0,8.3e-006,8.3e-006,800,600,1600,1200]
  • set_calib_data_cam_param (CalibDataID, 0, ‘area_scan_division’, StartCamPar)
  • 这两句应一起使用 ,上一句是准备初始化相机参数,参数分别是【焦距单位m,Kappa单位1/m*m,像元宽单位m,像元高单位m,图像坐标系原点在像素坐标系的行坐标单位像素,图像坐标系原点在像素坐标系的行坐标单位像素,图像宽单位像素,图像高单位像素】
    准备好相机初始化参数后,执行第二句话,第二句第一个参数为标定句柄,第二个参数为相机索引,第三个是
    相机扫描类型有线扫,面扫等多个参数,根据相机扫描类型的不同,第四个参数相机参数也会有变化,这里选择的是面扫。第四个就是刚才准备好的相机初始化参数
  • set_calib_data_calib_object (CalibDataID, 0, CalTabDescrFile)
  • 再设置标定句柄的标定文件参数 【标定句柄,相机索引,标定文件路径(就是descr文件,也可以是cpd文件)】
  • 查找

  • TmpCtrl_FindCalObjParNames := [‘gap_tolerance’,‘alpha’,‘skip_find_caltab’]
  • TmpCtrl_FindCalObjParValues := [1,1,‘false’]
  • find_calib_object (Image, CalibDataID, 0, 0,Index, TmpCtrl_FindCalObjParNames, TmpCtrl_FindCalObjParValues)
  • 该函数作用为在图像中查找标定板并且添加到句柄中,【图像,标定句柄,相机索引,标定板索引,pose位置索引,参数名称默认[],参数值默认[]】
  • get_calib_data_observ_pose (CalibDataID, 0, 0, Index, ObjInCameraPose)
  • 查看当前标定板在图像坐标系中的Pose信息,【标定句柄,相机索引,标定板索引,姿态Pose索引,输出参数Pose】
  • get_calib_data_observ_contours (Contours, CalibDataID, ‘marks’, 0, 0, 0)
  • 查看当前图像中标定板的(mask点、标定板外框、当前标定板外框)XLD信息,【输出XLD轮廓,标定句柄,输出类型,相机索引,标定板索引,Pose索引】。
  • get_calib_data_observ_points (CalibDataID, 0, 0, 0, Row, Column, Index1, Pose1)
  • 查看当前位姿下的mask点数据(行列信息),【标定句柄,相机索引,标定板索引,位姿Pose索引,mask行信息,mask列信息,mask索引,Pose】
  • get_calib_data_observ_pose (CalibDataID, 0, 0, Index, ObjInCameraPose)
  • 查看当前位姿下的Pose数据【标定句柄、相机索引、标定板索引、姿态索引、输出姿态信息】
  • 注:以上只是查看在标定之前的一些中间参数 不可以以此作为最终数据进行标定后的测量等 因为摄像机内参数还是初始值
  • 标定

  • calibrate_cameras (CalibDataID, Error)
  • 标定只有一行代码 【标定句柄、误差单位像素】
  • 测试

  • get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
    for Index := 0 to |ImageFiles| - 1 by 1
        read_image (Image, ImageFiles[Index])
        get_calib_data (CalibDataID, 'calib_obj_pose', [0,Index], 'pose', RealPose)
        get_calib_data_observ_points (CalibDataID, 0, 0, Index, Row2, Column2, Index2, Pose)
        set_origin_pose (RealPose, 0.0, 0.0, 0.001, Pose)
        image_points_to_world_plane (CamParam, Pose, Row2, Column2, 'm', SX, SY)
        gen_cross_contour_xld (Cross, Row2[0], Column2[0], 6, 0.785398)
        gen_cross_contour_xld (Cross, Row2[1], Column2[1], 6, 0.785398)    
        distance_pp (SY[0], SX[0], SY[1], SX[1], Width)
        disp_message (3600, 'Distance:' + Width, 'window', 100, 100, 'black', 'true')
        stop()
    endfor

  • 简单讲一下 首先获取标定后的相机内参矩阵 再根据每张图片中标定板姿态信息求出世界坐标中的两点距离

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值