<?xml version="1.0" encoding="UTF-8"?>
|
<hdevelop file_version="1.1" halcon_version="12.0">
|
<procedure name="M071_GetResults">
|
<interface>
|
<io>
|
<par name="INPUT_Image" base_type="iconic" dimension="0"/>
|
</io>
|
<ic>
|
<par name="INPUT_Resolution_X" base_type="ctrl" dimension="0"/>
|
<par name="INPUT_Resolution_Y" base_type="ctrl" dimension="0"/>
|
<par name="INPUT_Resolution_Z" base_type="ctrl" dimension="0"/>
|
<par name="INPUT_ImageId" base_type="ctrl" dimension="0"/>
|
</ic>
|
<oc>
|
<par name="OUTPUT_Results" base_type="ctrl" dimension="0"/>
|
</oc>
|
</interface>
|
<body>
|
<c>*阈值修改</c>
|
<l>LowValue := 0</l>
|
<c>*取值半径</c>
|
<l>resultRadius := 8</l>
|
<c>*滤值参数</c>
|
<l>Low := 5</l>
|
<l>High := 10</l>
|
<c></c>
|
<l>z1 := []</l>
|
<l>z2 := []</l>
|
<l>z3 := []</l>
|
<l>z4 := []</l>
|
<l>OUTPUT_Results := []</l>
|
<c></c>
|
<c>*预处理获取最小外接矩形</c>
|
<l>threshold (INPUT_Image, Region, 3500 + LowValue, 12000)</l>
|
<l>dilation_rectangle1 (Region, Region, 5, 5)</l>
|
<l>connection (Region, ConnectedRegions)</l>
|
<l>select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20000, 600000)</l>
|
<l>smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Length1, Length2)</l>
|
<l>gen_rectangle2 (Rectangle, Row, Column, Phi, Length1 - (1.9/INPUT_Resolution_X), Length2 - (1.9/INPUT_Resolution_X))</l>
|
<c></c>
|
<c>*计算rectangle2四个顶点坐标</c>
|
<l>tuple_cos (Phi, Cos)</l>
|
<l>tuple_sin (Phi, Sin)</l>
|
<c>*左上</c>
|
<l>a := Length1*Cos - Length2*Sin</l>
|
<l>b := Length1*Sin + Length2*Cos</l>
|
<c>*右上</c>
|
<l>c := Length1*Cos + Length2*Sin</l>
|
<l>d := Length1*Sin - Length2*Cos</l>
|
<c>*右下</c>
|
<l>e := -Length1*Cos + Length2*Sin</l>
|
<l>f := -Length1*Sin - Length2*Cos</l>
|
<c>*左下</c>
|
<l>g := -Length1*Cos - Length2*Sin</l>
|
<l>h := -Length1*Sin + Length2*Cos</l>
|
<c></c>
|
<c>*矩形四点坐标</c>
|
<l>A := [Row - h, Column + g]</l>
|
<l>B := [Row - b, Column + a]</l>
|
<l>C := [Row - f, Column + e]</l>
|
<l>D := [Row - d, Column + c]</l>
|
<c></c>
|
<c>*判断坐标位置并排序</c>
|
<l>if(A[1] < Column)</l>
|
<l> if (A[0] < Row)</l>
|
<l> z1[0] := A[0]</l>
|
<l> z1[1] := A[1]</l>
|
<l> else</l>
|
<l> z2[0] := A[0]</l>
|
<l> z2[1] := A[1]</l>
|
<l> endif</l>
|
<l>elseif (A[1] > Column)</l>
|
<l> if (A[0] < Row)</l>
|
<l> z3[0] := A[0]</l>
|
<l> z3[1] := A[1]</l>
|
<l> else</l>
|
<l> z4[0] := A[0]</l>
|
<l> z4[1] := A[1]</l>
|
<l> endif</l>
|
<l>endif</l>
|
<l>if(B[1] < Column)</l>
|
<l> if (B[0] < Row)</l>
|
<l> z1[0] := B[0]</l>
|
<l> z1[1] := B[1]</l>
|
<l> else</l>
|
<l> z2[0] := B[0]</l>
|
<l> z2[1] := B[1]</l>
|
<l> endif</l>
|
<l>elseif (B[1] > Column)</l>
|
<l> if (B[0] < Row)</l>
|
<l> z3[0] := B[0]</l>
|
<l> z3[1] := B[1]</l>
|
<l> else</l>
|
<l> z4[0] := B[0]</l>
|
<l> z4[1] := B[1]</l>
|
<l> endif</l>
|
<l>endif</l>
|
<l>if(C[1] < Column)</l>
|
<l> if (C[0] < Row)</l>
|
<l> z1[0] := C[0]</l>
|
<l> z1[1] := C[1]</l>
|
<l> else</l>
|
<l> z2[0] := C[0]</l>
|
<l> z2[1] := C[1]</l>
|
<l> endif</l>
|
<l>elseif (C[1] > Column)</l>
|
<l> if (C[0] < Row)</l>
|
<l> z3[0] := C[0]</l>
|
<l> z3[1] := C[1]</l>
|
<l> else</l>
|
<l> z4[0] := C[0]</l>
|
<l> z4[1] := C[1]</l>
|
<l> endif</l>
|
<l>endif</l>
|
<l>if(D[1] < Column)</l>
|
<l> if (D[0] < Row)</l>
|
<l> z1[0] := D[0]</l>
|
<l> z1[1] := D[1]</l>
|
<l> else</l>
|
<l> z2[0] := D[0]</l>
|
<l> z2[1] := D[1]</l>
|
<l> endif</l>
|
<l>elseif (D[1] > Column)</l>
|
<l> if (D[0] < Row)</l>
|
<l> z3[0] := D[0]</l>
|
<l> z3[1] := D[1]</l>
|
<l> else</l>
|
<l> z4[0] := D[0]</l>
|
<l> z4[1] := D[1]</l>
|
<l> endif</l>
|
<l>endif</l>
|
<c></c>
|
<c>*所有点向内缩1.9mm</c>
|
<l>z1[0] := z1[0] + (1.9/INPUT_Resolution_Y)</l>
|
<l>z1[1] := z1[1] + (1.9/INPUT_Resolution_X)</l>
|
<l>z2[0] := z2[0] - (1.9/INPUT_Resolution_Y)</l>
|
<l>z2[1] := z2[1] + (1.9/INPUT_Resolution_X)</l>
|
<l>z3[0] := z3[0] + (1.9/INPUT_Resolution_Y)</l>
|
<l>z3[1] := z3[1] - (1.9/INPUT_Resolution_X)</l>
|
<l>z4[0] := z4[0] - (1.9/INPUT_Resolution_Y)</l>
|
<l>z4[1] := z4[1] - (1.9/INPUT_Resolution_X)</l>
|
<c></c>
|
<c>*显示取点中心</c>
|
<l>gen_cross_contour_xld(Cross, z1[0], z1[1], 6, Phi)</l>
|
<l>gen_cross_contour_xld(Cross, z2[0], z2[1], 6, Phi)</l>
|
<l>gen_cross_contour_xld(Cross, z3[0], z3[1], 6, Phi)</l>
|
<l>gen_cross_contour_xld(Cross, z4[0], z4[1], 6, Phi)</l>
|
<c></c>
|
<c></c>
|
<c>*获取Z1值,滤值</c>
|
<l>gen_circle (Circle, z1[0], z1[1], resultRadius)</l>
|
<l>if (Low > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - Low, Min, LowGray, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, High, Min, HighGray, Range)</l>
|
<l>elseif (High > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, Low, LowGray, Max, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - High, HighGray, Max, Range)</l>
|
<l>else</l>
|
<l> min_max_gray (Circle, INPUT_Image, 50, LowGray, HighGray, Range)</l>
|
<l>endif</l>
|
<c>*如果上下限相等,则直接取中位数,否则滤值</c>
|
<l>if(LowGray == HighGray)</l>
|
<l> result1 := LowGray</l>
|
<l>else</l>
|
<l> reduce_domain (INPUT_Image, Circle, ImageReduced) </l>
|
<l> threshold (ImageReduced, Region, LowGray, HighGray)</l>
|
<l> min_max_gray (Region, ImageReduced, 50, result1, Max, Range)</l>
|
<l>endif</l>
|
<c></c>
|
<c>*获取Z2值,滤值</c>
|
<l>gen_circle (Circle, z2[0], z2[1], resultRadius)</l>
|
<l>if (Low > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - Low, Min, LowGray, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, High, Min, HighGray, Range)</l>
|
<l>elseif (High > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, Low, LowGray, Max, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - High, HighGray, Max, Range)</l>
|
<l>else</l>
|
<l> min_max_gray (Circle, INPUT_Image, 50, LowGray, HighGray, Range)</l>
|
<l>endif</l>
|
<c>*如果上下限相等,则直接取中位数,否则滤值</c>
|
<l>if(LowGray == HighGray)</l>
|
<l> result2 := LowGray</l>
|
<l>else</l>
|
<l> reduce_domain (INPUT_Image, Circle, ImageReduced) </l>
|
<l> threshold (ImageReduced, Region, LowGray, HighGray)</l>
|
<l> min_max_gray (Region, ImageReduced, 50, result2, Max, Range)</l>
|
<l>endif</l>
|
<c></c>
|
<c>*获取Z3值,滤值</c>
|
<l>gen_circle (Circle, z3[0], z3[1], resultRadius)</l>
|
<l>if (Low > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - Low, Min, LowGray, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, High, Min, HighGray, Range)</l>
|
<l>elseif (High > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, Low, LowGray, Max, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - High, HighGray, Max, Range)</l>
|
<l>else</l>
|
<l> min_max_gray (Circle, INPUT_Image, 50, LowGray, HighGray, Range)</l>
|
<l>endif</l>
|
<c>*如果上下限相等,则直接取中位数,否则滤值</c>
|
<l>if(LowGray == HighGray)</l>
|
<l> result3 := LowGray</l>
|
<l>else</l>
|
<l> reduce_domain (INPUT_Image, Circle, ImageReduced) </l>
|
<l> threshold (ImageReduced, Region, LowGray, HighGray)</l>
|
<l> min_max_gray (Region, ImageReduced, 50, result3, Max, Range)</l>
|
<l>endif</l>
|
<c></c>
|
<c>*获取Z4值,滤值</c>
|
<l>gen_circle (Circle, z4[0], z4[1], resultRadius)</l>
|
<l>if (Low > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - Low, Min, LowGray, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, High, Min, HighGray, Range)</l>
|
<l>elseif (High > 50)</l>
|
<l> min_max_gray (Circle, INPUT_Image, Low, LowGray, Max, Range)</l>
|
<l> min_max_gray (Circle, INPUT_Image, 100 - High, HighGray, Max, Range)</l>
|
<l>else</l>
|
<l> min_max_gray (Circle, INPUT_Image, 50, LowGray, HighGray, Range)</l>
|
<l>endif</l>
|
<c>*如果上下限相等,则直接取中位数,否则滤值</c>
|
<l>if(LowGray == HighGray)</l>
|
<l> result4 := LowGray</l>
|
<l>else</l>
|
<l> reduce_domain (INPUT_Image, Circle, ImageReduced) </l>
|
<l> threshold (ImageReduced, Region, LowGray, HighGray)</l>
|
<l> min_max_gray (Region, ImageReduced, 50, result4, Max, Range)</l>
|
<l>endif</l>
|
<c></c>
|
<l>OUTPUT_Results := [result1*INPUT_Resolution_Z, result2*INPUT_Resolution_Z, result3*INPUT_Resolution_Z, result4*INPUT_Resolution_Z]</l>
|
<l>return ()</l>
|
</body>
|
<docu id="M071_GetResults">
|
<parameters>
|
<parameter id="INPUT_Image"/>
|
<parameter id="INPUT_ImageId"/>
|
<parameter id="INPUT_Resolution_X"/>
|
<parameter id="INPUT_Resolution_Y"/>
|
<parameter id="INPUT_Resolution_Z"/>
|
<parameter id="OUTPUT_Results"/>
|
</parameters>
|
</docu>
|
</procedure>
|
</hdevelop>
|