halcon标定_记录(转自2638jrx)

标定步骤 :                                                                                                                         halcon标定_记录(转自2638jrx)_第1张图片

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标定_记录(转自2638jrx)_第2张图片

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标定_记录(转自2638jrx)_第3张图片

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

你可能感兴趣的:(机器视觉,图像处理,halcon,标定)