Halcon学习笔记:Halcon标定步骤-3d_coordinates.hdev示例

本文介绍了Halcon相机标定的详细步骤,从设置相机内部参数初始值到3d_coordinates测量,包括畸变模型选择、标定板初始化、数据模型创建、图像获取等关键环节。通过示例展示了如何使用Halcon进行三维坐标测量,并对相关算子进行了简要说明。

Halcon标定步骤

1.设置相机内部参数的初始值

StartCamPar := [0.016,0,0.0000074,0.0000074,326,247,652,494]
set_calib_data_cam_param (CalibDataID, 0, ‘area_scan_division’, StartCamPar)

1.1 相机型号

  • (1)面阵
  • (2)线阵

1.2 参数设置(这里只讲面阵相机)

  • (1)Division 畸变模型
    CameraParam:[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
  • (2)Polynomial 畸变模型
    CameraParam:[Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]
    注:当镜头为远心镜头时,Focus=0;

1.3 畸变类型的选择

  • Division 畸变模型只适用于精度要求不是很高,标定图片数量较少的情况;Polynomial 畸变模型对镜像
    畸变和切向畸变都校正,精度较高,花费时间长。

1.4 标定时个参数值的确定技巧

  • Focus f:镜头的标称焦距,( e.g, 0.016 m; 对于远心镜头为0。)
  • κ: 一般去0.0

Or:

  • K1, K2, K3,P1, P2:可全部初始化为0

  • Sx: 由CCD\CMOS确定建议取值如下:
    Full image (640480) Subsampling (320240)
    1/3"-Chip 0.0000055 m 0.0000110 m
    1/2"-Chip 0.0000086 m 0.0000172 m
    2/3"-Chip 0.0000110 m 0.0000220 m

  • Sy: 由CCD\CMOS确定建议取值如下:
    for example:
    Full image (640480) Subsampling (320240)
    1/3"-Chip 0.0000055 m 0.0000110 m
    1/2"-Chip 0.0000086 m 0.0000172 m
    2/3"-Chip 0.0000110 m 0.0000220 m

  • Cx and Cy: 光心坐标初始值,建议取值如下:
    for example:
    Full image (640480) Subsampling (320240)
    Cx 320.0 160.0
    Cy 240.0 120.0

  • ImageWidth,ImageHeight:有实际图片大小来初始化该值
    for example:
    Full image (640480) Subsampling (320240)
    ImageWidth 640 320
    ImageHeight 480 240

2.标定板初始化
    CaltabName := 'caltab_30mm.descr'//标定板描述文件
    set_calib_data_calib_object (CalibDataID, 0, CaltabName)
3.创建数据模型
	create_calib_data ('calibration_object', 1, 1, CalibDataID)
4.获取标定图片

相机拍摄不同位姿下图片8-15张,拍摄图片时标定板尽量覆盖整个视场(标定板要根据工作距离、视场大小定制);拍摄图片上的圆直径不得小于10个像素

#### 5.加载所有图像,寻找标定板区域,确定圆心,将结果加载到组元中
for I := 1 to NumImages by 1
... acquire image ...(获取图像)
find_caltab (Image, Caltab, CaltabName, SizeGauss, MarkThresh, MinDiamMarks)
find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, StartThresh, \
      DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoord, CCoord, StartPose)
 // 从标定数据模型中获取基于点的观测数据(49个点的坐标,索引,粗略估计被测校准物体相对于被测相机的姿态)
set_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, 'all', StartPose)
endfor

下面将Halcon中提取目标点的大致原理说一下:

  • 首先find_caltab 算子对图像高斯滤波(核大小为SizeGauss),接着阈值分割(与之大小为MarkThresh)将标定板的区域找出来, find_marks_and_pose 算子对区域中的圆进行分割,找到圆的个数,周长,坐标位置等应该和标定板描述文件中的一致,否则会自动调整StartThresh,使得StartThresh按照DeltaThresh步长减小到MinThresh,直到找到准确的圆心。
6.有了所有图像中的圆心就可以标定了
* 返回平均投影误差Errors
    calibrate_cameras (CalibDataID, Errors)
7.示例:3d_coordinates 测量世界坐标中的倾斜物体

本地函数: get_measure_positions
(Image : PlateRegion : CalibDataID, PoseIndex : Distance, Phi, RowCenter, ColumnCenter)

** 提取标定板(二值化、计算连通量、利用形状特征选择区域,填充空洞)
* 形状特征有:每个连通区域的孔数;最小包围矩形长度的一半;最小的包围矩形的宽度的一半
threshold (Image, Region, 0, 120)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['holes_num','rect2_len1','rect2_len2'], 'and', [1,120,120], [1,200,200])
fill_up (SelectedRegions, PlateRegion)
*
** 从table(标定板表盘)的边框构造测量矩形:
* 生成区域XLD轮廓
* 计算XLD轮廓的“回归线”的参数
gen_contour_region_xld (PlateRegion, Contours, 'center')
segment_contours_xld (Contours, ContoursSplit, 'lines', 7, 4, 2)
regress_contours_xld (ContoursSplit, RegressContours, 'no', 1)
* 获取两边的垂直边框线(42)
select_contours_xld (RegressContours, VerticalContours, 'direction', rad(45), rad(135), -0.5, 0.5)
select_contours_xld (VerticalContours, LongContours, 'length', 150, 500, -0.5, 0.5)
*
** 测量线由table的两个垂直边框线的中心点构成:
* 从对象数组中的选择对象(21* 获得XLD轮廓所有坐标
select_obj (LongContours, Contour
<think>嗯,用户遇到了HALCON无法打开指定示例文件的问题,需要结合站内引用和HALCON特性给出解决方案。从引用[3]可以看出用户关注的是2D测量相关功能,而引用[1][2]提到了HDevelop示例的组织结构,这很关键。 用户可能正在学习HALCON的测量模块,但被基础路径问题卡住了。ta的提问很具体,说明已经查阅过文档但路径引用方式有误。需要重强调HALCON示例路径的固定结构,因为引用[2]里roads.hdev等案例展示的都是直接文件名而非完整路径。 注意到用户前次对话涉及快速排序,但本次是全新的图像处理问题,不需要关联历史回答。不过要警惕用户潜在的误操作:ta可能把示例文件当作独立脚本运行,而忽略了HALCON环境的内置路径映射机制。 解决方案的核心在于三:一是纠正路径格式(用户误加了examples前缀),二是补充替代方案(直接搜索功能),三是预防性提醒路径设置技巧。引用[1]提到的新算子distance_cc_min_points正好印证了HALCON示例命名的规律性,可以暗示用户通过关键词检索更快定位文件。 特别要注意的是,用户引用[3]描述的测量模型创建流程与目标文件apply_metrology_model.hdev强相关,说明ta的需求本质是学习测量应用。因此补充的替代示例measure_circuit_width_lines_gauss.hdev(来自引用[2])同样具有参考价值,且该文件属于Lines-Gauss分类,避免用户死磕单一文件。 </think>针对HALCON无法打开文件`examples/hdevelop/2D-Metrology/apply_metrology_model.hdev`的问题,以下是系统化的解决方案,结合HALCON的路径管理机制: ### 原因分析与解决方法 1. **路径引用错误(最常见)** - HALCON示例文件通常存储在安装目录的子路径中,直接使用`examples/hdevelop/...`可能缺少根目录。 - ✅ **正确操作**: 在HDevelop中通过菜单加载: `文件 → 打开程序 → 选择HALCON安装目录 → examples → hdevelop → 2D-Metrology → apply_metrology_model.hdev` *示例路径参考:`C:\Program Files\MVTec\HALCON-版本号\examples\hdevelop\2D-Metrology\`* [^3] 2. **文件不存在或版本差异** - 验证文件是否存在:检查`2D-Metrology`文件夹内是否有`apply_metrology_model.hdev` - ✅ **替代方案**: 若文件缺失,可通过功能关键词全局搜索: `文件 → 打开程序 → 在HALCON安装目录搜索 "metrology"` → 类似功能示例:`measure_circuit_width_lines_gauss.hdev`(引用[2])、`features_points_xld.hdev`(引用[2])或`measure_circuit_width_lines_gauss.hdev`均可作为参考[^2][^3] 3. **环境变量配置问题** - 若需代码调用,需添加完整路径: ```python *read_image (Image, 'C:/Program Files/MVTec/HALCON-22.11/examples/hdevelop/2D-Metrology/apply_metrology_model.hdev')* ``` - ✅ **动态路径优化**: 使用HALCON系统变量`halcon_dir`自动定位: ```python get_system ('halcon_dir', HalconDir) # 获取安装目录 Path := HalconDir + '/examples/hdevelop/2D-Metrology/apply_metrology_model.hdev' read_image (Image, Path) ``` 4. **版本兼容性问题** - 较旧版本(如HALCON 12)可能无此文件,建议检查文档或升级至较新版本(引用[1]中新增算子`distance_cc_min_points`即表明新版功能扩展)[^1] --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值