test0730 发表于 2024-1-9 17:29:05

求解任意多边形最大内接矩形

https://blog.csdn.net/chenchensuperb/article/details/135273486
1.有一个项目需要求取任意多边形的最大内接矩形,找了halcon中的相关算子只有一个符合类似需求:

inner_rectangle1 — Largest inner rectangle of a region.

The operator inner_rectangle1 determines the largest axis-parallel rectangle that fits into a region. The rectangle is described by the coordinates of the corner pixels (Row1, Column1, Row2, Column2).

使用这个算子只能求得Region内最大的轴平行内接矩形,无法算出任意角度的最大内接矩形。

于是换个角度思考,将Region进行旋转,使用该算子求出剖分角度的ROI内轴平行内接矩形,

然后筛选出最大面积的内接矩形,并将此角度的内接矩形结果进行逆旋转Region的旋转角度,得出最大内接矩形,代码如下:

dev_open_window (0, 0, 800, 700, 'black', WindowHandle)
*dev_update_off ()

*生成一个图片,图片的像素大小求取精度,像素数越多,精度越高,同时运行所花时间越多。
gen_image_const (Image, 'byte', 5120, 3840)

dev_display (Image)

*画一个ROI (画一个闭合的polygon)

draw_polygon (PolygonRegion1, WindowHandle)
fill_up (PolygonRegion1, RegionFillUp)

*//Region旋转起始角度

StartAngle:=-180

*旋转停止角度
StopAngle:=180//Region

*//剖分数
times:=1000

*//剖分角度间距
step:=(rad(StopAngle)-rad(StartAngle))/times

*存储内接矩形面积
AREAS:=[]

*存储角度
Angles:=[]

*存储内接矩形的左上和右下坐标位置
Row1s:=[]
Col1s:=[]
Row2s:=[]
Col2s:=[]

*开始计算

for Index := 1 to times by 1

*获取当前步的角度值
   AngleStep:=(Index-1)*step+rad(StartAngle)

*获取Region的中心
   area_center (RegionFillUp, Area, Row, Column)

*将Region旋转一个步的角度
   vector_angle_to_rigid (Row, Column, 0, Row, Column, AngleStep, HomMat2D)
   affine_trans_region (RegionFillUp, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

*求取轴平行内接矩形
   inner_rectangle1 (RegionAffineTrans, Row1, Column1, Row2, Column2)   

*存储内接矩形的结果
   Row1s:=
   Col1s:=
   Row2s:=
   Col2s:=

*获取矩形的面积
   gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
   area_center (Rectangle, Area1, Row3, Column3)

*存储面积和角度
   AREAS:=
   Angles:=


endfor

*对内接矩形的面积进行排序,找到最大的矩形面积和索引值

tuple_sort_index (AREAS, Indices)
tuple_length (Indices, Length)

*获取最大内接矩形的参数和Region旋转的角度

AngleOfMaxArea:=Angles]
Row1OfMaxRect:=Row1s]
Col1OfMaxRect:=Col1s]
Row2OfMaxRect:=Row2s]
Col2OfMaxRect:=Col2s]

*将找到的内接矩形反向旋转最大矩形面积索引处Region旋转的角度

area_center (RegionFillUp, Area, Row, Column)
vector_angle_to_rigid (Row, Column, AngleOfMaxArea, Row, Column,0, HomMat2D)
gen_rectangle1 (RectangleMax, Row1OfMaxRect, Col1OfMaxRect, Row2OfMaxRect, Col2OfMaxRect)
affine_trans_region (RectangleMax, RectangleMaxInPos, HomMat2D, 'nearest_neighbor')
dev_clear_window ()
dev_display (Image)
dev_set_color ('red')
dev_display (RegionFillUp)
dev_set_color ('green')
dev_display(RectangleMaxInPos)

*求取矩形的角度和面积相关参数

tuple_deg (AngleOfMaxArea, Deg)
area_center (RectangleMaxInPos, Area2, Row4, Column4)

效果如下:
————————————————
版权声明:本文为CSDN博主「chenchensuperb」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenchensuperb/article/details/135273486
页: [1]
查看完整版本: 求解任意多边形最大内接矩形