本质也是抓直线拟合然后计算角度,很简单的需求,代码如下:
- read_image (Image, './1.png')
- rgb1_to_gray (Image, Image)
- set_system ('clip_region', 'false')
- *//提取最大的基准区域
- threshold (Image, RegionA, 0, 198)
- connection (RegionA, RegionA)
- select_shape_std (RegionA, RegionA, 'max_area', 70)
- *//形态学获得角度计算的基准区域
- opening_circle (RegionA, RegionB, 10.5)
- connection (RegionB, RegionB)
- sort_region (RegionB, RegionB, 'first_point', 'true', 'column')
- select_obj (RegionB, RegionB1, 1)
- select_obj (RegionB, RegionB2, 2)
- *//获得基准点集
- get_region_ud_edge (RegionB1, 'Right', RowsB1, ColsB1)
- get_region_ud_edge (RegionB2, 'Left', RowsB2, ColsB2)
- *//拟合直线
- gen_contour_polygon_xld (ContLB1, RowsB1, ColsB1)
- fit_line_contour_xld (ContLB1, 'tukey', -1, 0, 5, 2, RowB1, ColB1, RowE1, ColE1, Nr, Nc, Dist)
- gen_arrow_contour_xld (ArrowB1, RowB1, ColB1, RowE1, ColE1, 5, 5)
- gen_contour_polygon_xld (ContLB2, RowsB2, ColsB2)
- fit_line_contour_xld (ContLB2, 'tukey', -1, 0, 5, 2, RowB2, ColB2, RowE2, ColE2, Nr, Nc, Dist)
- gen_arrow_contour_xld (ArrowB2, RowB2, ColB2, RowE2, ColE2, 5, 5)
- *//计算中线
- RowBM:=(RowB1+RowB2)/2
- ColBM:=(ColB1+ColB2)/2
- RowEM:=(RowE1+RowE2)/2
- ColEM:=(ColE1+ColE2)/2
- gen_arrow_contour_xld (ArrowBM, RowBM, ColBM, RowEM, ColEM, 5, 5)
- *//计算仿射变换
- RowC:=(RowBM+RowEM)/2
- ColC:=(ColBM+ColEM)/2
- angle_lx (RowBM, ColBM, RowEM, ColEM, AngleB)
- hom_mat2d_identity (HomMat2DI)
- hom_mat2d_rotate (HomMat2DI, -AngleB+rad(90), RowC, ColC, HomMat2DR)
- affine_trans_image (Image, ImageAF, HomMat2DR, 'constant', 'false')
复制代码
其中get_region_ud_edge是我自己封装的算子,输入区域和方向,输出区域在这个方向的边缘点
- set_system ('clip_region', 'false')
- smallest_rectangle1 (Region, Row1, Column1, Row2, Column2)
- if(Direction=='Up')
- gen_region_line (RegionL, Row2, Column1+1, Row2, Column2-1)
- elseif(Direction=='Down')
- gen_region_line (RegionL, Row1, Column1+1, Row1, Column2-1)
- elseif(Direction=='Left')
- gen_region_line (RegionL, Row1+1, Column2, Row2-1, Column2)
- elseif(Direction=='Right')
- gen_region_line (RegionL, Row1+1, Column1, Row2-1, Column1)
- endif
- union2 (Region, RegionL, Region)
- if(Direction=='Up' or Direction=='Down')
- closing_rectangle1 (Region, Region, 1, (Row2-Row1))
- else
- closing_rectangle1 (Region, Region, (Column2-Column1), 1)
- endif
- if(Direction=='Up')
- move_region (Region, RegionM, 1, 0)
- elseif(Direction=='Down')
- move_region (Region, RegionM, -1, 0)
- elseif(Direction=='Left')
- move_region (Region, RegionM, 0, 1)
- elseif(Direction=='Right')
- move_region (Region, RegionM, 0, -1)
- endif
- difference (Region, RegionM, Region)
- get_region_points (Region, Rows_Res, Cols_Res)
- if(Direction=='Up' or Direction=='Down')
- tuple_sort_index (Cols_Res, Cols_ResIndices)
- tuple_sort (Cols_Res, Cols_Res)
- tuple_select (Rows_Res, Cols_ResIndices, Rows_Res)
- else
- tuple_sort_index (Rows_Res, Rows_ResIndices)
- tuple_sort (Rows_Res, Rows_Res)
- tuple_select (Cols_Res, Rows_ResIndices, Cols_Res)
- endif
- if(Direction=='Up')
- Rows_Res:=Rows_Res-0.5
- elseif(Direction=='Down')
- Rows_Res:=Rows_Res+0.5
- elseif(Direction=='Left')
- Cols_Res:=Cols_Res-0.5
- elseif(Direction=='Right')
- Cols_Res:=Cols_Res+0.5
- endif
- return ()
复制代码 |