Halcon: 获取仿射矩形-rectangle2的四个顶点、四条边的中点

Halcon 工业应用实用教程中的一个例子:

* CenterY : 仿射矩形中心y
* CenterX: 仿射矩形中心x
* Phi: 仿射矩形角度
* Len1: 仿射矩形宽的一半
* Len2: 仿射矩形高的一半
* CornerY: 仿射矩形端点y
* CornerX: 仿射矩形端点x
* LineCenterY: 仿射矩形边中点y
* LineCenterx: 仿射矩形边中点x

* 矩形端点坐标、边中心坐标初始化
CornerY := []
CornerX := []
LineCenterY := []
LineCenterX := []

* 临时变量初始化
RowT := 0
ColT := 0

* 判断仿射矩形是否有效
if (Len1 <= 0 or Len2 <= 0)
    return()
endif

* 计算仿射矩形的正弦值、余弦值
tuple_cos(Phi, Cos)
tuple_sin(Phi, Sin)

* 矩形第一个端点计算(左上)
ColT := CenterX - Len1 * Cos - Len2 * Sin
RowT := CenterY - (-Len1 * Sin + Len2 * Cos)
CornerY := [CornerY, RowT]
CornerX := [CornerX, ColT]

* 矩形第二个端点计算(右上)
ColT := CenterX + Len1 * Cos - Len2 * Sin
RowT := CenterY - (Len1 * Sin + Len2 * Cos)
CornerY := [CornerY, RowT]
CornerX := [CornerX, ColT]

* 矩形第三个端点计算(右下)
ColT := CenterX + Len1 * Cos + Len2 * Sin
RowT := CenterY - (Len1 * Sin - Len2 * Cos)
CornerY := [CornerY, RowT]
CornerX := [CornerX, ColT]

* 矩形的第四个端点计算(左下)
ColT := CenterX - Len1 * Cos + Len2 * Sin
RowT := CenterY - (-Len1 * Sin - Len2 * Cos)
CornerY := [CornerY, RowT]
CornerX := [CornerX, ColT]

* 矩形第一条边中心坐标(上边)
LineCenterY[0] := (CornerY[0] + CornerY[1]) * 0.5
LineCenterX[0] := (CornerX[0] + CornerX[1]) * 0.5

* 矩形第二条边中心坐标(右边)
LineCenterY[1] := (CornerY[1] + CornerY[2]) * 0.5
LineCenterX[1] := (CornerX[1] + CornerX[2]) * 0.5

* 矩形第三条边中心坐标(下边)
LineCenterY[2] := (CornerY[2] + CornerY[3]) * 0.5
LineCenterX[2] := (CornerX[2] + CornerX[3]) * 0.5

* 矩形第四条边中心坐标(左边)
LineCenterY[3] := (CornerY[3] + CornerY[0]) * 0.5
LineCenterX[3] := (CornerX[3] + CornerX[0]) * 0.5


return ()

结果s
在这里插入图片描述

最近有人说这个计算的原理错了(其实是书上的一段例程),我现将计算方式展示如下,若有错误之处,请指出!!!
(PS:在实际使用的过程中,会遇到顶点顺序的问题,所以加一个对坐标的判断即可)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要计算拟合出最小外接矩形2的四个顶点坐标,并进行仿射变换,可以按照以下步骤进行: 1. 首先,使用Halcon的`gen_rectangle2`函数计算出最小外接矩形的相关参数,包括中心点坐标、宽度、高度和旋转角度。假设这些参数分别为`Row`(中心点的行坐标)、`Column`(中心点的列坐标)、`Length1`(宽度)、`Length2`(高度)和`Phi`(旋转角度)。 2. 然后,根据最小外接矩形的参数,可以计算出四个顶点相对于中心点的相对坐标。根据矩形的宽度和高度以及旋转角度,可以得到四个顶点的相对坐标分别为: - 左上角:(-Length1/2, -Length2/2) - 右上角:(Length1/2, -Length2/2) - 右下角:(Length1/2, Length2/2) - 左下角:(-Length1/2, Length2/2) 3. 接下来,可以将相对坐标转换为绝对坐标,即将相对坐标加上中心点的坐标。四个顶点的绝对坐标分别为: - 左上角:(Row - Length2/2*cos(Phi) - Length1/2*sin(Phi), Column + Length2/2*sin(Phi) - Length1/2*cos(Phi)) - 右上角:(Row - Length2/2*cos(Phi) + Length1/2*sin(Phi), Column + Length2/2*sin(Phi) + Length1/2*cos(Phi)) - 右下角:(Row + Length2/2*cos(Phi) + Length1/2*sin(Phi), Column - Length2/2*sin(Phi) + Length1/2*cos(Phi)) - 左下角:(Row + Length2/2*cos(Phi) - Length1/2*sin(Phi), Column - Length2/2*sin(Phi) - Length1/2*cos(Phi)) 4. 最后,如果需要进行仿射变换,可以使用Halcon的`affine_trans_region`函数将最小外接矩形区域进行仿射变换。根据仿射变换的需求,可以设置变换矩阵,然后将最小外接矩形区域与变换矩阵一起传递给`affine_trans_region`函数。 以上是使用Halcon计算拟合出最小外接矩形2的四个顶点坐标并进行仿射变换的一般步骤,具体实现时需要根据实际情况进行调整和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值