功能:卡尺工具检测圆。
THIK:检测圆的方法,还有基础的二值化+Blob。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
list_files ('C:/Users/19901/Desktop/JnsWhite/图像/2024-10-16', 'files', Files)
tuple_length (Files, Length)


for Index := 0 to 21 by 1
read_image (Image, Files[Index])
access_channel (Image, Image, 2)
get_image_size (Image, Width, Height)

dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

* 圆环坐标
CircleInitRow := [540, 1520, 540, 1520]
CircleInitColumn := [1040, 1040, 1675, 1675]
gen_cross_contour_xld (Cross1, CircleInitRow, CircleInitColumn, 6, 0.785398)
CircleInitRadius := [gen_tuple_const(4, 105)]
CircleRadiusTolerance := 30

* 测量模型
create_metrology_model (MetrologyHandle)
set_metrology_model_image_size (MetrologyHandle, Width, Height)

add_metrology_object_circle_measure (MetrologyHandle, CircleInitRow, CircleInitColumn, CircleInitRadius, CircleRadiusTolerance, 5, 1, 8, [], [], MetrologyCircleIndices)

* 最大数量、边缘极性、最小分数
set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'num_instances', 1)

set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'measure_transition', 'negative')
set_metrology_object_param (MetrologyHandle, MetrologyCircleIndices, 'min_score', .5)
apply_metrology_model (Image, MetrologyHandle)


get_metrology_object_result (MetrologyHandle, MetrologyCircleIndices, 'all', 'result_type', 'all_param', CircleParameter)
Sequence := [0:3:|CircleParameter| - 1]
CircleRow := CircleParameter[Sequence]
CircleColumn := CircleParameter[Sequence + 1]
CircleRadius := CircleParameter[Sequence + 2]

get_metrology_object_result_contour (Contours, MetrologyHandle, 'all', 'all', 1.5)
get_metrology_object_measures (Contour, MetrologyHandle, 'all', 'all', Row1, Column1)
gen_cross_contour_xld (Cross, Row1, Column1, 6, 0.785398)

dev_display (Image)
dev_set_line_width (1)
dev_display (Contour)
dev_display (Cross)
dev_set_line_width (2)
dev_display (Contours)


* 数据存储
open_file ('C:/Users/19901/Desktop/CircleRadius.csv', 'append', FileHandle)

NumCircles := |CircleRadius|
for i := 0 to NumCircles-1 by 1
CircleRadiusScaled := CircleRadius[i] * 0.0125 * 2
CircleRadiusRounded := number(CircleRadiusScaled$'.3f')
fwrite_string (FileHandle, CircleRadiusRounded + ', ')
endfor
fwrite_string (FileHandle, '\n')
close_file(FileHandle)

endfor