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方法精度更高。

posted @ 2022-09-24 21:08  广阔之海  阅读(2604)  评论(0编辑  收藏  举报