Halcon——摄像机标定
创建
- 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
简单讲一下 首先获取标定后的相机内参矩阵 再根据每张图片中标定板姿态信息求出世界坐标中的两点距离
推荐阅读