nx_multi_body_test.nx source
↩ module page · 67 lines · 2291 B
1// nx_multi_body_test.nx -- smoke for multi-subject presence.
2// T1: empty -> NO_BODY. T2: 25x25 torso -> SOLO. T3: two 30x50 -> TWO_BODY.
3
4import "nx_syscalls.nx"
5import "nx_image.nx"
6import "nx_multi_body.nx"
7
8func fill_rect_skin(img: *Image, x0: i64, y0: i64, x1: i64, y1: i64) -> i64 {
9 var y: i64 = y0
10 while y < y1 {
11 var x: i64 = x0
12 while x < x1 {
13 nx_image_set(img, x, y, 0, 200)
14 nx_image_set(img, x, y, 1, 150)
15 nx_image_set(img, x, y, 2, 130)
16 x = x + 1
17 }
18 y = y + 1
19 }
20 return 0
21}
22
23func fill_black(img: *Image) -> i64 {
24 var y: i64 = 0
25 while y < img.height {
26 var x: i64 = 0
27 while x < img.width {
28 nx_image_set(img, x, y, 0, 0); nx_image_set(img, x, y, 1, 0); nx_image_set(img, x, y, 2, 0)
29 x = x + 1
30 }
31 y = y + 1
32 }
33 return 0
34}
35
36func main() -> i64 {
37 let v: *MultiBodyVerdict = (sys_mmap(64)) as *MultiBodyVerdict
38
39 // T1: empty 128x128 -> NO_BODY
40 let img1: *Image = nx_image_alloc(128, 128, 3)
41 fill_black(img1)
42 nx_multi_body_compute(img1, v)
43 if v.kind != NX_MB_NO_BODY { return 1 }
44 if v.skin_region_count != 0 { return 2 }
45
46 // T2: single 25x25 torso 2025 px > major_floor 800 -> SOLO
47 let img2: *Image = nx_image_alloc(128, 128, 3)
48 fill_black(img2)
49 fill_rect_skin(img2, 40, 40, 85, 85)
50 nx_multi_body_compute(img2, v)
51 if v.kind != NX_MB_SOLO { return 10 }
52 if v.skin_region_count != 1 { return 11 }
53 if v.largest_area < 2000 { return 12 }
54
55 // T3: two separated 30x50 bodies -> TWO_BODY
56 let img3: *Image = nx_image_alloc(128, 128, 3)
57 fill_black(img3)
58 fill_rect_skin(img3, 10, 30, 40, 80)
59 fill_rect_skin(img3, 60, 30, 90, 80)
60 nx_multi_body_compute(img3, v)
61 if v.kind != NX_MB_TWO_BODY { return 20 }
62 if v.skin_region_count != 2 { return 21 }
63 if v.largest_area < 1400 { return 22 }
64 if v.second_area < 1400 { return 23 }
65
66 return 0
67}