欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Halcon——摄像机标定

程序员文章站 2023-12-27 14:00:33
...

文章目录

创建

  • gen_caltab (7, 7, 0.00375, 0.5, ‘caltab.descr’, ‘caltab.ps’)

首先创建标定文件 根据所用的标定板的款式输入不同的参数 前两个参数分别是X,Y轴两个方向上的点数,第三个是中心距单位mm 第四个为小圆点直径与中心距的比例 例如我用的中心距3.75mm 小圆直径1.875mm 则第四个参数填0.5 运行之后的descr文件之后会用到 ps文件可以查看

  • create_calib_data (‘calibration_object’, 1, 1, CalibDataID)

创建标定句柄 第一个参数选择标定类型 有手眼标定四个选项和摄像机标定,第二个参数为摄像机个数,第三个为标定板个数,第四个标定句柄。

  • 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

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


\color{blue}{乘风破浪会有时 加油}
Halcon——摄像机标定

上一篇:

下一篇: