Halcon标准坐标和以边为中心坐标

文章讨论了Halcon中的标准坐标和以边为中心坐标的区别,指出在使用HomMat2D和模板匹配时可能出现的坐标转换问题。解决方法包括对以边为中心的坐标进行适当的补偿,如使用affine_trans_contour_xld。affine_trans_pixel和affine_trans_point_2d分别对应不同坐标系统,后者常用于精确的手眼标定。

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

标准坐标在这里插入图片描述

按照文档解释:此坐标是halcon标准坐标系,又叫图像坐标系,原点位于图像左上角第一个像素的中间,属于亚像素精确坐标。使用row,column表示位置

以边为中心

在这里插入图片描述

按照文档解释:此坐标是halcon以边为中心标系,原点位于图像左上角第一个像素的左上角,属于亚像素精确坐标。使用x,y表示位置
由此很明显的可以知道两个坐标系相差0.5个像素点

使用以边为中心坐标系的算子


翻译过来的意思是:
在HALCON中,算子运行在不同的坐标系统中。一方面,对象被期望在它运行在标准坐标中。另一方面,对于HomMat2D变换矩阵,算子需要具有上述变换优势的边缘中心坐标
所以我觉得除了以边为中心坐标的算子,其他的算子应该都是标准坐标(个人见解)

使用以边为中心坐标系的算子

在这里插入图片描述
如上算子是采用边为中心坐标系的算子,如果使用这些算子就行变换,将会以边为中心坐标系进行。

在这里插入图片描述
同时,模板匹配也是运行在边为中心的坐标中,但是输出的原点坐标是已经转换为标准坐标的,可以直接使用affine_trans_contour_xld等算子进行变换而不会产生误差

会产生什么后果?

比如你使用area_center_xld算子求出xld重心点坐标,实际这个重心是标准坐标系下的坐标
然后你把它使用affine_trans_contour_xld进行重心点旋转,这个时候你会发现两个区域并不重合,
原因就是使用了两个不同坐标系导致的,怎么解决呢?

HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
AffineTransContourXld(Contours, ContoursAffineTrans, HomMat2DAdapted)

如上代码所示进行补偿,经过affine_trans_contour_xld转换的坐标是边中心坐标,让其添加补偿后变为标准坐标
注意:只有当出现旋转时才会导致这种情况

affine_trans_pixel

该算子使用的是边中心坐标,只要涉及了旋转,算出的值就会导致其与标准坐标有误差

affine_trans_point_2d

该算子使用的是标准坐标,通常使用在手眼标定上
比如相机图像上的标准坐标转换为设备上的X,Y
而且根据文档所说,只要你保证所有操作都在一个坐标系上进行,那么affine_trans_point_2d实际可以运行在标准坐标和边中心坐标上的
在这里插入图片描述

<think>好的,我现在需要帮助用户在Halcon中以特定坐标点为中心旋转图像或对象。首先,我得回忆一下Halcon中相关的操作符。记得Halcon里有hom_mat2d_identity这样的算子来创建仿射变换矩阵,然后通过一系列变换来调整旋转中心。 用户提到的是围绕特定坐标点旋转,而不是默认的原点。通常旋转是绕原点进行的,所以需要先将旋转中心平移到原点,旋转后再平移回去。这个过程需要构建一个复合变换矩阵。例如,使用hom_mat2d_translate来平移,hom_mat2d_rotate来旋转。 接下来需要考虑的是如何应用这个变换矩阵到图像或对象上。对于图像,可能需要使用affine_trans_image;对于区域或其他对象,可能需要affine_trans_region或类似的算子。 用户可能需要具体的代码示例,所以得提供一个步骤清晰的例子。比如,先定义旋转角度中心点,然后生成变换矩阵,最后应用变换。需要注意的是坐标系的转换,Halcon坐标系原点通常在左上角,这点可能会影响平移的参数。 另外,旋转后的图像可能会有部分超出原图范围,需要处理边界情况,比如设置外推方法,或者调整输出图像的大小。例如,在affine_trans_image中使用'constant'来填充空白区域。 还需要考虑性能问题,比如是否需要插值方法,不同的插值方法可能会影响处理速度结果质量。常见的选项有双线性插值('bilinear')或最近邻('nearest_neighbor')。 可能的相关问题包括如何旋转区域而不仅仅是图像,或者如何调整旋转后的坐标系统。此外,用户可能想知道如何处理旋转后的对象的坐标变换,比如获取变换后的位置数据。 最后,要确保代码示例正确无误,语法正确,并且符合Halcon的版本要求。可能需要提醒用户检查Halcon的文档,确认算子的参数是否适用他们的版本。</think>在Halcon中实现以指定坐标点为中心的旋转需要三个步骤:创建仿射变换矩阵、平移坐标系、执行旋转变换。具体实现如下: ```python * 定义旋转参数 Angle := rad(45) * 旋转角度(弧度制) CenterX := 300 * 旋转中心X坐标 CenterY := 200 * 旋转中心Y坐标 * 创建变换矩阵 hom_mat2d_identity(HomMat2DIdentity) * 初始化单位矩阵 hom_mat2d_translate(HomMat2DIdentity, -CenterX, -CenterY, HomMat2DTranslate) * 平移坐标系到中心点 hom_mat2d_rotate(HomMat2DTranslate, Angle, 0, 0, HomMat2DRotate) * 执行旋转 hom_mat2d_translate(HomMat2DRotate, CenterX, CenterY, HomMat2DResult) * 平移回原坐标系 * 应用变换矩阵 * 对图像旋转: affine_trans_image(Image, ImageRotated, HomMat2DResult, 'constant', 'false') * 对区域旋转: affine_trans_region(Region, RegionRotated, HomMat2DResult, 'nearest_neighbor') ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值