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

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

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

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的手眼标定相关知识。根据引用内容,手眼标定有两种形式,眼在手上和眼在手外,用户关注的是二维情况下的眼在手上标定,可能用于平面视觉引导机械臂的场景。 首先,我需要确定Halcon中是否有对应的标定流程。引用中提到Halcon例程解读,如3d_coordinates.hdev,但用户问的是二维坐标,可能需要调整步骤。通常,二维标定可能涉及相机固定在机械臂末端,拍摄平面标定板,通过多个位姿计算相机与机械臂的关系。 接下来,我需要整理步骤。根据引用[1],手眼标定流程包括初始化参数、构建坐标系、执行标定、显示结果等。但二维情况可能不需要三维坐标系,所以可能需要简化。例如,标定板可能使用二维棋盘格,相机拍摄不同位姿下的标定板图像,记录机械臂的位姿(X、Y、θ),然后通过Halcon的算子计算转换关系。 然后,考虑到用户提到的tool-base和cam-obj的关系,标定方程可能是AX=XB,其中X是相机到工具坐标系的变换矩阵。在二维情况下,这可能涉及旋转矩阵和平移向量的求解。Halcon中的算子如calibrate_hand_eye可能支持二维标定,需要确认参数设置是否正确。 另外,引用[3]提到1D测量算子,但二维标定可能需要使用其他算子,如find_calib_object或calibrate_cameras。不过手眼标定更可能使用特定的手眼标定函数,需要查阅Halcon文档确认。 用户可能需要具体的步骤,例如准备标定板、采集多个位姿的数据、运行标定算法等。同时,需要注意相机内参的标定是否已完成,因为手眼标定通常需要已知相机内参。根据引用[1],流程包括相机标定和手眼标定两部分,所以可能需要先进行相机标定,再进行手眼标定。 最后,总结步骤时应分说明,包括准备工作、数据采集、标定执行、验证结果等,并引用相关参考资料中的部分,如标定方程AX=XB和齐次变换矩阵的应用。同时,生成相关问题,帮助用户深入理解。</think>### Halcon二维坐标“眼在手上”标定步骤Halcon中实现二维“眼在手上”标定,核心目标是建立机械臂末端(工具坐标系)与相机坐标系之间的转换关系,使得视觉检测结果能直接映射到机械臂坐标系中。以下是详细步骤--- #### **1. 准备工作** - **标定板选择**:使用平面标定板(如棋盘格或圆阵列),需保证标定板图案的尺寸和间距已知[^1]。 - **相机内参标定**:首先完成相机内参标定(焦距、畸变等),确保图像坐标到物理坐标的准确性[^3]。 - **机械臂运动范围**:规划机械臂多个不同位姿(建议至少10个),覆盖工作区域,确保标定板在相机视野内。 --- #### **2. 数据采集** 1. **机械臂位姿记录**: - 控制机械臂移动到不同位姿,记录每个位姿下的工具坐标系(`tool`)相对于基坐标系(`base`)的坐标$(x_i, y_i, \theta_i)$,其中$\theta_i$为旋转角度。 2. **图像采集**: - 在每个位姿下拍摄标定板图像,通过`find_calib_object`或`find_chessboard`算子提取标定板角或圆心坐标(相机坐标系下的坐标$u_i, v_i$)。 --- #### **3. 标定执行** 使用Halcon算子`calibrate_hand_eye`进行标定: ```python * 定义标定模型 create_calib_data ('hand_eye_scara_calibration', 1, 1, CalibDataID) * 设置相机内参(已标定) set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', CamParam) * 添加机械臂位姿和标定板位姿 for i := 0 to NumPoses-1 by 1 set_calib_data (CalibDataID, 'tool', i, PoseTool) set_calib_data (CalibDataID, 'calib_obj_pose', i, PoseObj) endfor * 执行标定(AX=XB问题) calibrate_hand_eye (CalibDataID, Error) * 获取标定结果(X: 工具坐标系到相机坐标系的变换) get_calib_data (CalibDataID, 'camera', 0, 'params', CameraPose) ``` --- #### **4. 验证与误差分析** - **重投影误差**:将标定结果应用到新位姿,对比实际机械臂坐标与视觉计算坐标的偏差。 - **可视化验证**:使用`disp_caltab`或`disp_chessboard`在图像中叠加投影后的坐标系,观察对齐效果。 --- #### **关键公式** - **转换关系**:$$ T_{\text{base}}^{\text{tool}} \cdot X = X \cdot T_{\text{cam}}^{\text{obj}} $$ 其中$X$为工具坐标系到相机坐标系的齐次变换矩阵,需通过多组位姿联立求解[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值