Halcon九点及旋转标定流程

本文详细介绍了Halcon的XY轴九点标定及旋转轴标定过程,用于机器视觉中的精确定位。在XY轴标定中,通过仿射变换获取图像与世界坐标的转换矩阵。旋转轴标定则关注于获取旋转中心,通过计算不同旋转角度下物体特征点的偏移,结合旋转角度,推导出∆x和∆y,实现定位补偿。

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

 

参考文章:剖析Halcon 9点标定旋转中心标定与使用_william9987的博客-优快云博客_halcon旋转标定

 

一、XY轴九点标定:

使用仿射变换:

夹具夹取产品或者标定块,选取一个特征,开始进行标定

X轴、Y轴移动一个位置,记录轴的物理坐标:(Qx1,Qy1)

提取图像中对应特征点,图像像素坐标:(Px1,Py1)

运动第N位置,记录下点位轴轴坐标(QxN,QyN),t提取像素坐标:(PxN,PyN)

使用vector_to_hom_mat2d (Px, Py, Qx , Qy, HomMat2D)得到图像坐标和世界坐标的转换关系矩阵。这种简单的标定方法不能消除镜头和相机畸变。

 

*创建空数组用来存放模板在图像坐标系的位置
ImageXPix:=[]
ImageYPix:=[]
*****************************
*确定好相机移动的九个物理坐标数组
WorldX:=[8,8,8,0,0,0,-8,-8,-8]
WorldY:=[-8,0,8,8,0,-8,-8,0,8]

*开始标定
i:=0
* 打开相机
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'ccd1', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
*采集图像  获取9个像素坐标
for i:=1 to 9 by 1   
     grab_image (Image, AcqHandle) 
    *用第一张图片创建模板
    if(i=1)
        disp_message(3600, '创建模板区域,右键确定', 'window', 12, 12, 'red', 'false')
        draw_region(Region, 3600)
        reduce_domain(Image, Region, ImageReduced)
        create_shape_model(ImageReduced, 'auto', rad(-180
### 如何在 Halcon 中实现区域旋转功能 在 Halcon 中,可以通过一系列操作来完成区域(region)的旋转。具体来说,可以先将区域转换为轮廓(XLD),利用 `affine_trans_contour_xld` 或其他变换函数对轮廓进行旋转操作,然后再将轮廓重新转换回区域。 以下是详细的说明和代码示例: #### 将区域转换为轮廓 为了对区域应用仿射变换(如旋转、缩放和平移),通常需要将其转换为 XLD 轮廓形式。这一步骤可通过以下算子实现: ```plaintext gen_region_contour_xld(Region, Contours, 'filled') [^1] ``` 此命令会生成一个填充型的轮廓对象,表示输入区域的边界。 --- #### 对轮廓执行旋转操作 一旦获得了轮廓对象,就可以使用 `affine_trans_contour_xld` 函数对其进行任意仿射变换。对于单纯的旋转操作,需指定旋转中心点 `(RowCenter, ColCenter)` 和角度参数 `Phi`(单位为弧度)。例如: ```hdevelop * 定义旋转参数 RowCenter := 200 ColCenter := 300 Phi := rad(-45) * 创建负45度角(以弧度计) * 执行旋转 affine_trans_contour_xld(Contours, RotatedContours, RowCenter, ColCenter, 1, 0, 0, 1, Phi, 'nearest_neighbor') ``` 上述代码片段中的 `rad(-45)` 是用于将以度数表示的角度转换成弧度制的形式[^2]。注意,在实际编程环境中可能需要用具体的数值替代这些变量。 --- #### 将旋转后的轮廓转回区域 最后一步是把经过旋转处理过的轮廓再变换成新的区域结构以便进一步分析或者显示出来: ```plaintext gen_contour_region_xld(RotatedContours, TransformedRegion, 'filled') ``` 这样就完成了整个流程——从初始状态下的某个特定形状到最终被调整过姿态的新图形实体创建过程。 --- ### 示例代码综合展示 下面给出一段完整的 HDevelop 脚本样例供参考学习之用: ```hdevelop read_image(Image, 'fabrik') threshold(Image, Region, 128, 255) * Convert the region into an XLD contour. gen_region_contour_xld(Region, Contours, 'filled') * Define rotation parameters and perform transformation on contours. RowCenter := 200 ColCenter := 300 Phi := rad(-45) affine_trans_contour_xld(Contours, RotatedContours, RowCenter, ColCenter, 1, 0, 0, 1, Phi, 'bilinear_interp') * Transform back from rotated contours to new regions. gen_contour_region_xld(RotatedContours, RotatedRegion, 'filled') dev_display(Image) set_color('green') draw_region(RotatedRegion, WindowHandle) ``` 以上脚本展示了如何加载一幅图像并提取其中的一个阈值化区域作为起点;接着对该选定部分实施几何学上的旋转变更动作;最后再次呈现修改成果于屏幕上查看效果。 --- ### 注意事项 - **坐标系定义**:Halocn 使用的是标准笛卡尔直角坐标体系,原点位于左上角位置处,Y轴朝下延伸而X轴则水平向右延展开来。 - **精度控制**:当涉及到连续空间内的映射关系时,“最近邻插值”方法可能会引起一定程度的数据失真现象发生,因此建议视具体情况选用更为高级别的重采样策略比如双线性差值算法等选项代替默认设置项。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stephon_100

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

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

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

打赏作者

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

抵扣说明:

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

余额充值