标定步骤 :                                                                                                                         

halcon深度学习标注软件导出数据集之后 halcon 标定_标定

1.设置相机内部参数的初始值 


StartCamPar := [0.016,0,0.0000074,0.0000074,326,247,652,494] 


set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar) 


  1.1 相机型号 


      (1)面阵 


      (2)线阵 


  1.2 参数设置(这里只讲面阵相机) 


      (1)Division畸变模型 


          CameraParam:[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight] 


      (2)Polynomial 畸变模型 


          CameraParam:[Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight] 


          注:当镜头为远心镜头时,Focus=0; 


  1.3 畸变类型的选择 


      Division畸变模型只适用于进度要求不是很高,标定图片数量较少的情况;Polynomial 畸变模型对镜像 


      畸变和切向畸变都校正,精度较高,花费时间长。 


  1.4 标定时个参数值的确定技巧 


      Focus f:镜头的标称焦距, e.g., 0.016 m.; 对于远心镜头为0. 


      κ: 一般去0.0 


      Or: 


      K1, K2, K3,P1, P2:可全部初始化为0 


      Sx: 由CCD\CMOS确定建议取值如下: 


           Full image (640*480) Subsampling (320*240) 


           1/3"-Chip 0.0000055 m 0.0000110 m 


           1/2"-Chip 0.0000086 m 0.0000172 m 


           2/3"-Chip 0.0000110 m 0.0000220 m 


      Sy: 由CCD\CMOS确定建议取值如下: 


          for example: 


           Full image (640*480) Subsampling (320*240) 


           1/3"-Chip 0.0000055 m 0.0000110 m 


           1/2"-Chip 0.0000086 m 0.0000172 m 


           2/3"-Chip 0.0000110 m 0.0000220 m 


      Cx and Cy: 光心坐标初始值,建议取值如下: 


         for example: 


          Full image (640*480) Subsampling (320*240) 


          Cx 320.0 160.0 


          Cy 240.0 120.0 


      ImageWidth,ImageHeight:有实际图片大小来初始化该值 


       for example: 


      Full image (640*480) Subsampling (320*240) 


      ImageWidth 640 320 


      ImageHeight 480 240 


2.标定板初始化 


    CaltabName := 'caltab_30mm.descr'//标定板描述文件 


    set_calib_data_calib_object (CalibDataID, 0, CaltabName) 


3.创建数据模型 


create_calib_data ('calibration_object', 1, 1, CalibDataID) 


4.获取标定图片 


    相机拍摄不同位姿下图片8-15张,拍摄图片时标定板尽量覆盖整个视场(标定板要根据工作距离、视场大小定制);拍摄图片上的圆直径不得小于10个像素 


5.加载所有图像,寻找标定板区域,确定圆心,将结果加载到组元中 


for I := 1 to NumImages by 1 


... acquire image ... 


  find_caltab (Image, Caltab, CaltabName, SizeGauss, MarkThresh, MinDiamMarks) 


  find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, StartThresh, \ 


      DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoord, CCoord, StartPose) 


  set_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, 'all', StartPose) 


endfor 


下面将Halcon中提取目标点的大致原理说一下: 


首先find_caltab 算子对图像高斯滤波(核大小为SizeGauss),接着阈值分割(与之大小为MarkThresh)将标定板的区域找出来, find_marks_and_pose 算子对区域中的圆进行分割,找到圆的个数,周长,坐标位置等应该和标定板描述文件中的一致,否则会自动调整StartThresh,使得StartThresh按照DeltaThresh步长减小到MinThresh,知道找到准确的圆心。 


6.有了所有图像中的圆心就可以标定了 


    calibrate_cameras (CalibDataID, Errors) 


    返回平均投影误差Errors 



* Calibration parameters 


CaltabDescr := 'caltab_100mm.descr' 


CaltabThickness := 0.0064 


NumCameras := 4 


NumCalibObjects := 1 


NumPoses := 20 


CameraType := 'area_scan_polynomial' 


StartCamPar := [0.0085, 0.0, 0.0, 0.0, 0.0, 0.0, 6e-6, 6e-6, Width*.5, Height*.5, Width, Height] 




* Create camera calibration model and set parameters 


create_calib_data ('calibration_object', NumCameras, NumCalibObjects, CalibDataID) 


* Set used camara type 


set_calib_data_cam_param (CalibDataID, 'all', CameraType, StartCamPar) 


* Set used calibration object 


set_calib_data_calib_object (CalibDataID, 0, CaltabDescr) 

相关算子介绍:                                                                                                                    

halcon深度学习标注软件导出数据集之后 halcon 标定_标定

1.create_calib_data( : : CalibSetup, NumCameras, NumCalibObjects : CalibDataID) 
创建一个标定(数据)模型 
CalibSetup:标定类型 
NumCameras:相机数目 
NumCalibObjects:图片中标定板个数 
CalibDataID:标定模型句柄(标示符) 
2.set_calib_data_cam_param( : : CalibDataID, CameraIdx, CameraType, CameraParam : ) 
相机标定(数字)模型类型和初始参数设置 
CalibDataID:标定模型句柄(标示符) 
CameraIdx:相机索引号(编号) 
CameraType:相机的类型 
CameraParam:初始相机的内部参数 
3. set_calib_data_calib_object( : : CalibDataID, CalibObjIdx, CalibObjDescr : ) 
定义校准对象相机校准数据模型的索引 
CalibDataID:标定模型句柄(标示符) 
CameraIdx:相机索引号(编号) 
CalibObjDescr:三维点坐标或文件名 
4.find_caltab(Image : Caltab : CalTabDescrFile, SizeGauss, MarkThresh, MinDiamMarks : ) 
分割标定板区域 
Image:图像 
Caltab:标定板区域 
CalTabDescrFile:文件名 
SizeGauss高斯滤波核大小 
MarkThresh阈值 
MinDiamMarks:标定板上圆的最小直径(像素单位) 
5.find_marks_and_pose(Image, CalTabRegion : : CalTabDescrFile, StartCamParam, StartThresh, DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks : RCoord, CCoord, StartPose) 
从图像中提取2D校准标记和外部摄像机参数计算的初始值 
Image:图像 
CalTabRegion:图像区域 
CalTabDescrFile:文件名 
StartCamParam:相机的内部参数初始值 
StartThresh:初始阈值,用于轮廓检测 
DeltaThresh:StartThresh值连续减少到MinThresh的步长 
MinThresh:用于轮廓检测的最低阈值 
Alpha:过滤器参数,用于轮廓检测 
MinContLength:标定圆的最小的轮廓长度 
MaxDiamMarks:标定圆的最大直 
RCoord:标定圆的ROW坐标值(输出值) 
CCoord:标定圆的Cloumn坐标值(输出值) 
StartPose:外部相机参数的估计(输出值) 
6.calibrate_cameras( : : CalibDataID : Error) 
执行相机标定 
CalibDataID:标定模型句柄(标示符) 
Error:最优投影误差(输出值) 
7.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin) 
                                   | 1 0 0  DX | 
PoseNewOrigin = PoseIn * | 0 1 0 DY | 
| 0 0 1 DZ | 
| 0 0 0 1 | 
 设置新的坐标原点,控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量,控制输出为新的位姿 
PoseIn:初始位姿 
DX,DY,DZ沿各坐标轴的平移值

halcon中关于标定的demo:                                                                                                

halcon深度学习标注软件导出数据集之后 halcon 标定_标定

有三个(calibrate_cameras.hdev;calibrate_sheet_of_light.hdev;camera_calibration.hdev)是关于polynomial畸变模型的,可能是因为这个模型的测量精度比较高,所以Demo比较少