Halcon 相机的标定与测量
图片地址
链接:https://pan.baidu.com/s/1hJU1h6KJCunFBtJx9aLs3Q
提取码:ng5g
***************1、初始化设置***************
* 关闭窗口
dev_close_window ()
dev_close_window ()
* 更新计数器、变量、图像窗口
dev_update_off ()
dev_set_draw ('margin')
* 读取图片
read_image (Image, './img/scratch_perspective.png')
get_image_pointer1 (Image, Pointer, Type, Width, Height)
* 打开窗口
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* 设置字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 显示图片
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
stop()
***************2、校正相机***************
* 标定文件名
CaltabName := 'caltab_30mm.descr'
* 相机内参:焦距 畸变系数,像素宽度(X)像素高度(y), 中心点x, 中心点y, 像素的宽度,像素的高度
* [Focus,Kappa,Sx,Sy,Cx,Cy,Whith,Height]
StartCamPar := [0.0184898,-548.002,8.33409e-006,8.3e-006,275.291,255.374,640,480]
* 标定数据模型
create_calib_data ('calibration_object', 1, 1, CalibDataID)
* 设置模型内参
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)
* 设置模型 标定文件
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
***************3、处理图片 获取图片参数***************
NumImages :=12
for i :=1 to NumImages by 1
* 读取图片
read_image (Image1, './img/scratch_calib_' + i$'02d')
* 显示图像
dev_display (Image1)
* 获取校正板内边框的区域
find_caltab (Image1, Caltab, CaltabName, 3, 112, 5)
* 显示标定板区域
dev_set_color ('green')
dev_display (Caltab)
* 寻找标记点位置
* RCoord、CCoord 点的坐标 StartPose
find_marks_and_pose (Image1, Caltab, CaltabName, StartCamPar, \
128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)
dev_set_color ('red')
* 显示MARK点的位置
disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|, 2.5))
dev_set_part (0, 0, Height-1, Width-1)
* 设置MARK点数据
set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoord, CCoord, 'all', StartPose)
stop()
endfor
***************4、执行标定 获取内参外参***************
dev_update_time ('on')
disp_continue_message (WindowHandle, 'black', 'true')
stop()
* 相机标定
calibrate_cameras (CalibDataID, Error)
* 获取内部参数
* [Focus,Kappa,Sx,Sy,Cx,Cy,Whith,Height]
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
* 获取外部参数
* :[X轴平移,Y轴平移,Z轴平移,X轴旋转,Y轴旋转,Z轴旋转]
get_calib_data (CalibDataID, 'calib_obj_pose', [0, 1], 'pose', PoseCalib)
***************5、使用转换图片 **************************
dev_open_window (0, Width + 5, Width, Height, 'black', WindowHandle1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
* 外参调整90度
insert (PoseCalib, PoseCalib[5] - 90, 5, PoseCalibRot)
* 相机位姿平移
set_origin_pose (PoseCalibRot, -0.04, -0.03, 0.00075, Pose)
* 像素物理长度
PixelDist := 0.00013
* map映射对应关系的建立
gen_image_to_world_plane_map (Map, CamParam, Pose, Width, Height,\
Width, Height, PixelDist, 'bilinear')
Imagefiles := ['img/scratch_calib_01.png', 'img/scratch_perspective.png']
for i :=1 to 2 by 1
* 读取图片
read_image (Image, Imagefiles[i-1])
dev_set_window (WindowHandle)
dev_display (Image)
dev_set_window (WindowHandle1)
* 图片映射
map_image (Image, Map, ModelImageMapped)
dev_display (ModelImageMapped)
stop()
endfor
***************6、划伤长度测量 **************************
* 设置绘制为填充
dev_set_draw ('fill')
fast_threshold (ModelImageMapped, Region, 0, 80, 20)
* 填充阈值后的区域
fill_up (Region, RegionFillUp)
* 腐蚀区域
erosion_rectangle1 (RegionFillUp, RegionErosion, 5, 5)
* 剪切区域图
reduce_domain (ModelImageMapped, RegionErosion, ImageReduced)
* 阈值分析
fast_threshold (ImageReduced, Region1, 55, 100, 20)
* 对阈值区域膨胀运算
dilation_circle (Region1, RegionDilation, 2.0)
erosion_circle (RegionDilation, RegionErosion1, 1.0)
* 连通性处理
connection (RegionErosion1, ConnectedRegions)
* 面积、等效椭圆过滤
select_shape (ConnectedRegions, SelectedRegions, ['area', 'ra'], 'and', [40, 15], [2000, 1000])
* 缺陷对象数目
count_obj (SelectedRegions, NumScratches)
* 显示校正后的图像
dev_display (ModelImageMapped)
* 循环显示缺陷
for i := 1 to NumScratches by 1
* 设置输出对象的颜色
dev_set_color ('yellow')
* 从SelectedRegions里根据索引获取子区域
select_obj (SelectedRegions, ObjectSelected, i)
* 获取ObjectSelected区域的骨架
skeleton (ObjectSelected, Skeleton)
* 获取骨架的轮廓XLD
gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')
* 显示缺陷的轮廓
dev_display (Contours)
* 计算缺陷轮廓的长度
length_xld (Contours, ContLength)
* 计算缺陷轮廓的面积和中心坐标
area_center_points_xld (Contours, Area, Row, Column)
* 显示缺陷的长度信息
disp_message (WindowHandle1, 'L= '+(ContLength*PixelDist*100)$'.4'+' cm', 'window', Row-10, Column+20, 'yellow', 'false')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
endfor