1.我们都知道由于成像原理的影响,普通镜头成像都会存在一定的畸变,如果在高精密检测项目中,就需要做图像校正来提升精度。下面的案例是Halcon图像校正的经典案例,话不多说,上干货。
2.代码分析
dev_close_window ()
dev_open_window (0, 0, 768 / 2, 576 / 2, ‘black’, WindowHandle1)
set_display_font (WindowHandle1, 14, ‘mono’, ‘true’, ‘false’)
dev_update_off ()
dev_set_draw (‘margin’)
dev_set_line_width (2)
*
- 初始化面阵相机参数(焦距Focus, 畸变系数Kappa, 像元Sx, 像元Sy, 图片中心Cx, 图片中心Cy, 图片宽度ImageWidth, 图片高度ImageHeight : 输出相机初始参数CameraParam)
gen_cam_par_area_scan_division (0.008, 0, 0.0000086, 0.0000086, 384, 288, 768, 576, StartCamPar)
create_calib_data (‘calibration_object’, 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)
CalTabDescrFile := ‘caltab_big.descr’
set_calib_data_calib_object (CalibDataID, 0, CalTabDescrFile)
*使用10张图片做相机的标定
NumImages := 10
read_image (Images, ‘calib/calib-3d-coord-’ + [1:NumImages]$‘02d’)
for I := 1 to NumImages by 1
select_obj (Images, Image, I)
dev_display (Image)
Message := ‘Find calibration plate in\nall calibration images (’ + I + ‘/’ + NumImages + ‘)’
disp_message (WindowHandle1, Message, ‘window’, 12, 12, ‘black’, ‘true’)- Find the calibration plate
find_calib_object (Image, CalibDataID, 0, 0, I - 1, [], [])
get_calib_data (CalibDataID, ‘camera’, 0, ‘init_params’, StartCamPar)
get_calib_data_observ_points (CalibDataID, 0, 0, I - 1, Row, Column, Index, Pose)
get_calib_data_observ_contours (Contours, CalibDataID, ‘caltab’, 0, 0, I - 1)
gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)
dev_set_color (‘green’)
dev_display (Contours)
dev_set_color (‘yellow’)
dev_display (Cross)
endfor
disp_continue_message (WindowHandle1, ‘black’, ‘true’)
stop ()
*标定,获取相机标定后的内参
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, ‘camera’, 0, ‘params’, CamParam)
*关键看这里,根据10不同图片的索引,获取10个相机外参位姿,分别构建10个图片矫正矩阵。
gen_empty_obj (Maps)
for I := 1 to NumImages by 1 - Obtain the pose of the calibration table
get_calib_data (CalibDataID, ‘calib_obj_pose’, [0,I - 1], ‘pose’, Pose)
*注意看这个算子,(-1.125,-1.0,0这三个值是怎么来的呢?首先说下0是标定板的厚度,默认无厚度设置0。-1.25和-1.0怎么来的呢?这个需要看下面那个算子gen_image_to_world_plane_map参数768, 576, 900, 800, 0.0025分别代表原图的宽,高。目标图的宽,高,单位是像素pixel。当前相机的像素当量是0.0025,单位是米m。-1.125=(900/2)*0.0025, -1.0=(800/2)*0.0025。一定要注意,目标图像的尺寸最好大于原图尺寸,否则做图像校正后,容易导致图片部分区域消失)
set_origin_pose (Pose, -1.125, -1.0, 0, PoseNewOrigin) - Generate map
gen_image_to_world_plane_map (MapSingle, CamParam, PoseNewOrigin, 768, 576, 900, 800, 0.0025, ‘bilinear’)
concat_obj (Maps, MapSingle, Maps)
endfor
- Find the calibration plate
- 根据各自位姿生成的矫正矩阵,矫正图像
dev_open_window (0, 391, 900 / 2, 800 / 2, ‘black’, WindowHandle2)
set_display_font (WindowHandle2, 14, ‘mono’, ‘true’, ‘false’)
Button := 0
NumImage := 1
for I := 1 to NumImages by 1
dev_set_window (WindowHandle1)
dev_set_part (0, 0, 575, 767)
dev_clear_window ()
select_obj (Images, Image, I)
dev_display (Image)
select_obj (Maps, MapSingle, I)
map_image (Image, MapSingle, ImageMapped)
dev_set_window (WindowHandle2)
dev_set_part (0, 0, 799, 899)
dev_clear_window ()
dev_display (ImageMapped)
Message := ‘Calibration image (’ + I + ‘/’ + NumImages + ‘)’
disp_message (WindowHandle1, Message, ‘window’, 12, 12, ‘black’, ‘true’)
Message := ‘Mapped image’
disp_message (WindowHandle2, Message, ‘window’, 12, 12, ‘black’, ‘true’)
if (I < NumImages)
disp_continue_message (WindowHandle1, ‘black’, ‘true’)
stop ()
endif
endfor





Halcon图像校正经典案例代码分析
2707

被折叠的 条评论
为什么被折叠?



