Halcon 相机的标定与测量

该博客详细介绍了使用Halcon进行相机标定的步骤,包括初始化设置、校正相机、处理图片获取参数、执行标定获取内外参以及利用转换后的图片进行划伤长度测量。通过这一过程,可以精确地计算出图像中物体的尺寸,提高自动化检测的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷益--飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值