Halcon 生成标定板
Halcon生成标定板:
gen_caltab(7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
XNum:X轴圆点数量
YNum:Y轴圆点数量
MarkDist:圆点间距,单位为米
DiameterRatio:圆点直径与间距的比率
CalPlateDescr:标定板描述文件
CalPlatePSFile:标定板PostScript图案,可以用PhotoShop打开。
Halcon12开始,可以使用新版蜂窝标定板,生成代码:
create_caltab(27, 31, 0.00258065, [13,6,6,20,20], [15,6,24,6,24], 'light_on_dark', 'calplate.cpd', 'calplate.ps')
NumRows:圆点行数
MarksPerRow:每行圆点数
Diameter:圆点直径,单位为米
FinderRow:所有寻位标志的行号
FinderColumn:所有寻位标志的列号
Polarity:背景色,黑或白
新版蜂窝标定板的行列数可以任意设置,圆心距为圆点直径的2倍,寻位标志不能多于5个
标定板的精度建议比检测精度高5-10倍,以下是不同标定板制作工艺的大致精度:
(1)菲林印制,精度大致能做到0.05mm - 0.1mm,菲林就是电影底片,厚度一般为0.18mm,白色部分透明,需要用玻璃板压平;
(2)氧化铝标定板,精度一般为0.01 - 0.001mm,用玻璃或陶瓷做基板,白色部分不透明,表面漫反射;
(3)玻璃标定板,精度能做到0.001mm,图案用光刻工艺加工,表面平整度很高,白色部分透明,黑色部分反光,可以用背光。
标定板的尺寸选择:
老版标定板图案尺寸为视场的1/2到3/4,新版蜂窝标定板需要视场覆盖1/3到2/3图案区域,必须拍到至少1个寻位点
圆点直径所占像素要大于50个,例如相机分辨率1280x960pix,视场大小40x30mm,则圆点直径大概1.5mm。
Halcon标定相机外参也可使用棋盘格标定板,下面为代码:
dev_update_off() read_image(Image, 'chessboard.png') gen_rectangle1 (ROI, 108.076, 86.0433, 406.842, 505.387) reduce_domain(Image, ROI, ImageReduced) dev_display(Image) * 1通过Harris方法提取角点 points_harris(ImageReduced, 0.7, 4, 0.08, 1000, Rows, Cols) gen_cross_contour_xld(Corners, Rows, Cols, 6, 0) dev_set_color('red') dev_display(Corners) stop() * 2通过边缘拟合直线交叉点的方式提取角点 edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40) segment_contours_xld(Edges, ContoursSplit, 'lines_circles', 5, 4, 2) select_contours_xld(ContoursSplit, SelectedContours, 'contour_length', 10, 200, 0, 0) select_contours_xld(SelectedContours, HorizontalContours, 'direction', rad(-10), rad(10), 0, 0) union_adjacent_contours_xld(HorizontalContours, HorizontalContours, 10, 1, 'attr_keep') select_contours_xld(SelectedContours, VerticalContours, 'direction', rad(80), rad(100), 0, 0) union_adjacent_contours_xld(VerticalContours, VerticalContours, 10, 1, 'attr_keep') fit_line_contour_xld(HorizontalContours, 'tukey', -1, 0, 5, 2, RowBegin1, ColBegin1, RowEnd1, ColEnd1, Nr1, Nc1, Dist1) fit_line_contour_xld(VerticalContours, 'tukey', -1, 0, 5, 2, RowBegin2, ColBegin2, RowEnd2, ColEnd2, Nr2, Nc2, Dist2) Rows := [] Cols := [] for I := 0 to |RowBegin1| - 1 by 1 for J := 0 to |RowBegin2| - 1 by 1 intersection_lines(RowBegin1[I], ColBegin1[I], RowEnd1[I], ColEnd1[I], RowBegin2[J], ColBegin2[J], RowEnd2[J], ColEnd2[J], Row, Col, IsOverlapping) Rows := [Rows, Row] Cols := [Cols, Col] endfor endfor gen_cross_contour_xld(Corners, Rows, Cols, 6, 0) dev_set_color('green') dev_display(Corners) stop() * 拟合棋盘格平面位姿 WorldX := [] WorldY := [] WorldZ := [] for X := 0 to 10 by 1 for Y := 0 to 7 by 1 WorldX := [WorldX, X * 10] WorldY := [WorldY, Y * 10] WorldZ := [WorldZ, 0] endfor endfor read_cam_par ('cam_param.cal', CameraParam) vector_to_pose(WorldX, WorldY, WorldZ, Rows, Cols, CameraParam, 'iterative', 'error', Pose, Quality)
这里用两种方法提取棋盘格的角点,如果镜头畸变较大的情况下,Harris方法精度更高。