Halcon九点及旋转标定流程

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

 

参考文章:剖析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), rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)        
    endif

    find_shape_model(Image, ModelID,  rad(-180), rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, 
参考资料中未提及C#中使用Halcon进行九点标定并添加旋转操作的具体内容,但可结合Halcon九点标定流程推测相关方法。 Halcon九点标定用于手眼标定或相机与机械臂的坐标系对齐,核心是计算相机坐标系到世界坐标系的转换矩阵。在C#中使用Halcon进行九点标定并添加旋转操作,可按以下步骤进行: 1. **准备工作**:使用包含9个已知坐标的特征点的标定板(如棋盘格或圆点阵列),在不同位姿下拍摄标定板,确保9个点均清晰可见且分布覆盖视野范围,并精确测量标定板上各特征点的物理坐标(单位:毫米)[^1]。 2. **九点标定**:在C#中调用Halcon的相关函数进行九点标定,计算出相机坐标系到世界坐标系的转换矩阵。 3. **添加旋转操作**:在得到转换矩阵后,通过Halcon旋转矩阵相关函数,结合旋转角度等参数,对转换矩阵进行旋转操作,以实现旋转功能。 以下是一个简单的示例代码框架: ```csharp using HalconDotNet; class HalconCalibration { public void NinePointCalibrationWithRotation() { // 初始化Halcon对象 HObject ho_Image; HTuple hv_WorldX, hv_WorldY, hv_ImageX, hv_ImageY; // 读取图像 HOperatorSet.ReadImage(out ho_Image, "calibration_image.jpg"); // 这里省略特征点提取等操作,得到世界坐标和图像坐标 // hv_WorldX, hv_WorldY 为世界坐标 // hv_ImageX, hv_ImageY 为图像坐标 // 进行九点标定 HTuple hv_HomMat2D; HOperatorSet.VectorToHomMat2d(hv_ImageX, hv_ImageY, hv_WorldX, hv_WorldY, out hv_HomMat2D); // 添加旋转操作 double rotationAngle = 30; // 旋转角度 HTuple hv_RotationMat; HOperatorSet.HomMat2dRotate(hv_HomMat2D, rotationAngle, 0, 0, out hv_RotationMat); // 后续可使用旋转后的矩阵进行坐标转换等操作 } } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

stephon_100

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

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

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

打赏作者

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

抵扣说明:

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

余额充值