使用Halcon暴力求解任意多边形最大内接矩形(逼近法)

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:=[Row1s,Row1]
     Col1s:=[Col1s,Column1]
     Row2s:=[Row2s,Row2]
     Col2s:=[Col2s,Column2]

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

*存储面积和角度
     AREAS:=[AREAS,Area1]
     Angles:=[Angles,AngleStep]


endfor

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

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

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

AngleOfMaxArea:=Angles[Indices[Length-1]]
Row1OfMaxRect:=Row1s[Indices[Length-1]]
Col1OfMaxRect:=Col1s[Indices[Length-1]]
Row2OfMaxRect:=Row2s[Indices[Length-1]]
Col2OfMaxRect:=Col2s[Indices[Length-1]]

*将找到的内接矩形反向旋转最大矩形面积索引处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)

效果如下:

 代码:

dev_open_window (0, 0, 800, 700, 'black', WindowHandle)
dev_update_off ()
gen_image_const (Image, 'byte', 5120, 3840)
*r:=[0,0,100,2050,2150,2150,2050,150,0]+500
*c:=[150,1350,1450,1450,1350,100,0,0,150]+500
* r:=[0,0,100,2050,2150,2150,2050,100,0]+500
* c:=[100,1350,1450,1450,1350,100,0,0,100]+500
dev_display (Image)
* row:=[100,105,303,300,100]
* column:=[201,402,510,199,201]
*gen_region_polygon (PolygonRegion1, r, c)
draw_polygon (PolygonRegion1, WindowHandle)
fill_up (PolygonRegion1, RegionFillUp)
*gen_region_contour_xld (ContOut, Region, 'filled')
*dev_display (RegionFillUp)
*inner_rectangle1 (RegionFillUp, Row1, Column1, Row2, Column2)
*dev_set_color ('green')
*gen_rectangle1 (Rectangle1, Row1, Column1, Row2, Column2)
*dev_display (Rectangle1)
StartAngle:=-180
StopAngle:=180
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)
     area_center (RegionFillUp, Area, Row, Column)
    * dev_set_color ('blue')
    * gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)   
    * dev_display (Cross)
     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:=[Row1s,Row1]
     Col1s:=[Col1s,Column1]
     Row2s:=[Row2s,Row2]
     Col2s:=[Col2s,Column2]
     gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
     area_center (Rectangle, Area1, Row3, Column3)
     AREAS:=[AREAS,Area1]
     Angles:=[Angles,AngleStep]
*      dev_clear_window ()
*      dev_set_color('red')
*      dev_display (RegionAffineTrans) 
*      dev_set_color('green')
*      dev_display (Rectangle)  
   * stop()
endfor
tuple_sort_index (AREAS, Indices)
tuple_length (Indices, Length)
AngleOfMaxArea:=Angles[Indices[Length-1]]
Row1OfMaxRect:=Row1s[Indices[Length-1]]
Col1OfMaxRect:=Col1s[Indices[Length-1]]
Row2OfMaxRect:=Row2s[Indices[Length-1]]
Col2OfMaxRect:=Col2s[Indices[Length-1]]
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)
  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值