| 
 | 
 
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:=[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) 
 
效果如下: 
———————————————— 
版权声明:本文为CSDN博主「chenchensuperb」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 
原文链接:https://blog.csdn.net/chenchensuperb/article/details/135273486 |   
 
 
 
 |