定位--自动更正测量对象的方向

对应示例程序:
correct_measure_direction.hdev

目标:对于用户输入的不合理ROI(ROI与被测对象不垂直),进行正确的纠正

思路为:
      1.读取图像,并初步画定ROI区域
      2.计算最小外接矩形,并通过Blob分析,得到边缘
      3.通过算子get_contour_angle_xld ,得到各个边缘点的倾斜角度,并将均值角度作为最后的纠正角度
      4.根据纠正角度,重新生成ROI区域,并利用算子measure_pairs计算得到相关测量参数。

图像:
在这里插入图片描述
在这里插入图片描述
代码:

* Display initializations
Interactive := 0 //交互参数
dev_close_window ()
dev_update_window ('off')
read_image (Image, 'fuse')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_display (Image)
* 
if (Interactive == 0)
    disp_message (WindowHandle, 'Measure rectangle generated', 'window', -1, -1, 'black', 'true')
    disp_message (WindowHandle, 'Wrong rotation will be corrected in the next step', 'window', 50, -1, 'black', 'true')
    dev_set_color ('blue')
    dev_set_line_width (2)
    gen_rectangle2 (Rectangle, 292, 540, rad(85), 80, 20)  //生成一个不合理的矩形框
    dev_display (Rectangle)
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    smallest_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2) //前边的本身矩阵
else
    * User interaction: input measure rectangle
    disp_message (WindowHandle, 'Modify measure rectangle (arrow up, confirm with right mouse)', 'window', -1, -1, 'black', 'true')
    disp_message (WindowHandle, 'Eventually wrong rotations will be corrected', 'window', 50, -1, 'black', 'true')
    dev_set_color ('blue')
    dev_set_line_width (2)
    draw_rectangle2_mod (WindowHandle, 292, 540, rad(85), 80, 20, Row, Column, Phi, Length1, Length2)
endif
* 
* Apply a first measurement
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'bicubic', MeasureHandle)
measure_pairs (Image, MeasureHandle, 1, 30, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
close_measure (MeasureHandle)
* 
* Extract edges and edge directions within the ROI
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
reduce_domain (Image, Rectangle, ImageReduced)
edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40)
get_contour_angle_xld (Edges, 'abs', 'regress', 3, Angles)  //计算轮廓点的角度
* 
* Use the mean edge direction to estimate the correct orientation
* of the measure rectangle.

*根据平均角度进行校正
MeanAngle := mean(Angles) - rad(90)
MeanAngleDeg := deg(MeanAngle)
* 
* correct the orientation of the measure rectangle
gen_measure_rectangle2 (Row, Column, MeanAngle, Length1, Length2, Width, Height, 'bicubic', MeasureHandle)
gen_rectangle2 (Rectangle2, Row, Column, MeanAngle, Length1, Length2)
measure_pairs (Image, MeasureHandle, 1, 30, 'all', 'all', RowEdgeFirst2, ColumnEdgeFirst2, AmplitudeFirst2, RowEdgeSecond2, ColumnEdgeSecond2, AmplitudeSecond2, IntraDistance2, InterDistance2)
close_measure (MeasureHandle)
* 
* Display results
dev_display (Image)
dev_set_draw ('margin')
p_disp_edge_marker (RowEdgeFirst, ColumnEdgeFirst, Phi, Length2, 'red', 2)  //显示一个标记,该标记指示边缘的位置
p_disp_edge_marker (RowEdgeSecond, ColumnEdgeSecond, Phi, Length2, 'red', 2)
dev_set_color ('red')
dev_display (Rectangle)
p_disp_edge_marker (RowEdgeFirst2, ColumnEdgeFirst2, MeanAngle, Length2, 'green', 2)
p_disp_edge_marker (RowEdgeSecond2, ColumnEdgeSecond2, MeanAngle, Length2, 'green', 2)
dev_set_color ('green')
dev_display (Rectangle2)
disp_message (WindowHandle, 'Measure direction corrected from ' + deg(Phi)$'.3' + ' deg to ' + MeanAngleDeg$'.3' + ' deg', 'window', -1, -1, 'black', 'true')
for I := 0 to min([|RowEdgeFirst|,|RowEdgeSecond|,|RowEdgeFirst2|,|RowEdgeSecond2|]) - 1 by 1
    disp_message (WindowHandle, 'Width [px]: ' + IntraDistance[I]$'.3' + ', corrected: ' + IntraDistance2[I]$'.3', 'window', (RowEdgeFirst[I] + RowEdgeSecond[I]) / 2 - 10, 150, 'black', 'false')
endfor


用到的几个算子:
      get_contour_angle_xld—为每个轮廓(contour)点计算一个XLD轮廓(contour)方向
      gen_measure_rectangle2–获得一个测量句柄
      measure_pairs–提取垂直于矩形或环形弧的直边对
      close_measure–删除一个measure对象
      p_disp_edge_marker–显示边缘对的位置

参考资料:
[1]:https://blog.csdn.net/fred_yang2013/article/details/12205925
[2]:https://blog.csdn.net/weixin_34397291/article/details/94513684
[3]:https://blog.csdn.net/mufeng008/article/details/84104099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值