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: 由CCDCMOS確定建議取值如下:
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: 由CCDCMOS確定建議取值如下:
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)
