对应示例程序:
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