halcon拓展系列—计算任意矩形的四个角点坐标算子find_rectangle2_points

该博客介绍了如何利用Halcon的find_rectangle2_points算子,结合正弦和余弦定理计算任意矩形的四个角点坐标。文章详细阐述了矩形描述的统一、坐标计算方法,并提供了代码示例,适用于图像处理中的Blob定位等应用场景。

计算任意矩形的四个角点坐标,基本数学方法利用到了初中高中数学知识:正弦定理和余弦定理

一、基础知识

1、halcon的矩形rectangle2定义

 

draw_rectangle2( : : WindowHandle : RowColumnPhiLength1Length2)

smallest_rectangle2(Regions : : : RowColumnPhiLength1Length2)

draw_rectangle2:窗口有个箭头方向,这个方向就是矩形的角度Phi,和Phi方向一致的边为Length1,和Phi方向垂直的边为Length2

smallest_rectangle2:Length1为长度较长的边,Length2为长度较短的边,且满足Phi为长边Length1方向的角度,角度范围

- pi / 2 < Phi && Phi <= pi / 2

两者相同点:Phi都是Length1的角度

两者不同点:draw_rectangle2的Length1,Length2和Phi与边长度无关,smallest_rectangle2与边长度有关

 

2、正弦定理和余弦定理

 

二、计算任意矩形的四个角点坐标

步骤

1、统一矩形描述

把rectangle2转为PI/2>Phi>PI/4,或者-PI/4>Phi>-PI/2,修改矩形的的描述方式,让矩形的Phi较大,这样保证矩形纵方向是Length1,横方向是Length2,

2、计算点A坐标

x=x(OM) - x(AM) = Length1*cos(angle) - Length2*sin(angle)---------------------1.1
y=y(ON) + y(AN) = Length1*sin(angle) + Length2*cos(angle)---------------------1.2

 

 

设xLengh1 = Length1*cos(angle)

xLength2 =  Length2*sin(angle)

yLength1 = Length1*sin(angle)

yLength2 = Length2*cos(angle)

简化1.1和1.2为

x = xLength1 - xLength2------------------------------------------1.3
y = yLength1 + yLength2------------------------------------------1.4

 

即A(xLength1 - xLength2, yLength1 + yLength2 )

同理,可以计算出B,C,D点的坐标,过程中要考虑到Phi有正负之分

 

详细代码如下

* ****************************************
* * 求rectangle2的四个直角点
* * 0********|*********2
* * *********|**********
* * *********|**********
* * *********|**********
* * *********|**********
* * *********|**********
* * 1********|*********3
* *注:以与水平方向所成角度较大的边中线为轴线
* ****************************************
pi := acos(0)*2
if (phi >= 0 and phi < pi/4)
    phi := phi - pi/2
    Tem := length1
    length1 := length2
    length2 := Tem
elseif (phi > -pi/4 and phi < 0)
    phi := phi + pi/2
    Tem := length1
    length1 := length2
    length2 := Tem
endif
* 
if (phi >= 0)
    la := phi    ///63
    lb := la - pi/2    ////-26
    tuple_tan (la, tem1)
    tuple_tan (lb, tem2)
    tuple_sqrt ((length1 * length1) / (1 + tem1 * tem1), xLength1)
    tuple_sqrt ((length2 * length2) / (1 + tem2 * tem2), xLength2)
    tuple_sqrt ((tem1*tem1*length1*length1) / (1 + tem1 * tem1), yLength1)
    tuple_sqrt ((tem2 * tem2 * length2 * length2) / (1 + tem2 * tem2), yLength2)
    * 左上
    gen_cross_contour_xld (Cross, 1, columnCenter + xLength1- xLength2, 6, 0.785398)
    mColumnUpLeft := columnCenter + xLength1 - xLength2
    nRowUpLeft := rowCenter - yLength1 - yLength2
    * 左下
    mColumnDownLeft := columnCenter - xLength1  - xLength2
    nRowDownLeft := rowCenter + yLength1 - yLength2
    * 右上
    mColumnUpRight := columnCenter + xLength1  + xLength2
    nRowUpRight  := rowCenter - yLength1 + yLength2
    * 右下
    mColumnDownRight := columnCenter - xLength1  + xLength2
    nRowDownRight  := rowCenter + yLength1 + yLength2 
else
    la := phi   
    lb := la - pi/2    
    tuple_tan (la, tem1)
    tuple_tan (lb, tem2)
    tuple_sqrt ((length1 * length1) / (1 + tem1 * tem1), xLength1)
    tuple_sqrt ((length2 * length2) / (1 + tem2 * tem2), xLength2)
    tuple_sqrt ((tem1*tem1*length1*length1) / (1 + tem1 * tem1), yLength1)
    tuple_sqrt ((tem2 * tem2 * length2 * length2) / (1 + tem2 * tem2), yLength2)
    * 左上
    mColumnUpLeft := columnCenter - xLength1 - xLength2
    nRowUpLeft := rowCenter - yLength1 + yLength2
*     disp_cross (3600, nRowUpLeft, mColumnUpLeft, 16, 0)
    * 左下
    mColumnDownLeft := columnCenter + xLength1  - xLength2
    nRowDownLeft := rowCenter + yLength1 + yLength2
*     disp_cross (3600, nRowDownLeft, mColumnDownLeft, 16, 0)
    * 右上
    mColumnUpRight := columnCenter - xLength1  + xLength2
    nRowUpRight  := rowCenter - yLength1 - yLength2
    * 右下
    mColumnDownRight := columnCenter + xLength1  + xLength2
    nRowDownRight  := rowCenter + yLength1 - yLength2 
endif
row := []
column := []
row[0] := nRowUpLeft
column[0] := mColumnUpLeft
row[1] := nRowDownLeft
column[1] := mColumnDownLeft
row[2] := nRowUpRight
column[2] := mColumnUpRight
row[3] := nRowDownRight
column[3] := mColumnDownRight
return ()

运行效果图如下

注:代码里面推导过程稍有不同,用到了tan(angle)=sin(angle)/cos(angle),最终结果都是一样的;基于这个方法,可以做很多算法,比如Blob粗定位,Blob精定位,直线滤波等;

因为方法没有引用其他方法,上述代码就是所有源码,这里就不上传源码

如需要hdvp函数请留言个人邮箱

 

 

————————————————
版权声明:本文为优快云博主「谷棵」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/gukewee/article/details/105787343

Halcon 中,计算矩形中心的方法通常依赖于矩形的表示形式。如果矩形是以坐标参数的形式给出(例如:`Row`, `Column`, `Phi`, `Length1`, `Length2`),则可以通过几何公式推导出矩形的中心坐标。 ### 使用矩形参数获取中心 对于一个通过以下参数定义的矩形: - `Row`: 矩形的中心行坐标。 - `Column`: 矩形的中心列坐标。 - `Phi`: 矩形旋转的度(以弧度为单位)。 - `Length1`: 沿着矩形主轴方向的一半长度。 - `Length2`: 垂直于主轴方向的一半长度。 在这种情况下,`Row` 和 `Column` 直接代表了矩形的中心坐标。 #### 示例代码 ```hdevelop * 定义矩形参数 Row := 256 Column := 256 Phi := 0.7854 * 弧度 (45°) Length1 := 50 Length2 := 30 * 获取矩形中心 CenterRow := Row CenterCol := Column * 显示中心 dev_display_cross (CenterRow, CenterCol, 12, 0.0) ``` ### 从图像中检测矩形计算中心矩形是图像中的实际对象时,需要先识别其轮廓,然后计算其几何属性。 #### 步骤说明 1. **提取矩形区域**:使用分割或匹配技术提取矩形对象的区域。 2. **生成轮廓**:将区域转换为 XLD 轮廓。 3. **拟合矩形模型**:使用 `fit_rectangle_contour_xld` 来拟合矩形。 4. **获取中心**:根据拟合结果直接获取中心。 #### 示例代码 ```hdevelop * 提取矩形轮廓 threshold (Image, Region, 128, 255) region_to_bin (Region, BinImage) find_contours_sub_pix (BinImage, Contours, 'canny', 1, 20, 30) * 拟合矩形 fit_rectangle_contour_xld (Contours, 'regression', -1, 0, 0, RectParams) * 提取矩形参数 RectRow := RectParams[0] RectColumn := RectParams[1] RectPhi := RectParams[2] RectLength1 := RectParams[3] RectLength2 := RectParams[4] * 获取中心 CenterRow := RectRow CenterCol := RectColumn * 显示中心 dev_display_cross (CenterRow, CenterCol, 12, 0.0) ``` ### 其他方法 如果矩形是由四个组成的多边形,则可以使用 `get_center_point` 计算其中心[^1]。 #### 示例代码 ```hdevelop * 假设矩形四个组成 Points := [Row1, Col1, Row2, Col2, Row3, Col3, Row4, Col4] get_center_point (Points, CenterRow, CenterCol) ``` ##
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谷棵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值