nx_pose_skeleton_gate.nx source
↩ module page · 66 lines · 3641 B
1// nx_pose_skeleton_gate.nx -- gate for the skeleton posture geometry (nx_pose_skeleton). Synthetic skeletons
2// (neck=0, lhip=1, rhip=2) prove upright/horizontal/inverted/unknown + midpoint + compactness.
3import "nx_syscalls.nx"
4import "nx_pose_skeleton.nx"
5
6func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return sys_write(1, s, n) }
7func gn(v: i64) -> i64 {
8 let bb: *u8 = sys_mmap(28); var m: i64 = v
9 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
10 let t: *u8 = sys_mmap(28); var k: i64 = 0
11 if m == 0 { t[0] = 48 as u8; k = 1 }
12 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
13 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
14 return sys_write(1, bb, k)
15}
16
17func main(argc: i64, argv: *i64) -> i64 {
18 var pass: i64 = 0
19 let qx: *i64 = sys_mmap(8 * 16) as *i64
20 let qy: *i64 = sys_mmap(8 * 16) as *i64
21 let cf: *i64 = sys_mmap(8 * 16) as *i64
22 let ox: *i64 = sys_mmap(8) as *i64; let oy: *i64 = sys_mmap(8) as *i64
23 var i: i64 = 0; while i < 16 { cf[i] = 100; i = i + 1 }
24
25 // S1 UPRIGHT: neck(40,10), hips(30,60)/(50,60) -> mid-hip below neck, vertical spine
26 qx[0] = 40; qy[0] = 10; qx[1] = 30; qy[1] = 60; qx[2] = 50; qy[2] = 60
27 var s1: i64 = pose_posture(qx, qy, cf, 50, 0, 1, 2)
28 if s1 == 0 { pass = pass + 1; gp("S1 upright -> 0 OK\n" as *u8) } else { gp("S1 FAIL=" as *u8); gn(s1); gp("\n" as *u8) }
29
30 // S2 HORIZONTAL: neck(10,40), hips(60,35)/(60,45) -> spine spread in x -> lying
31 qx[0] = 10; qy[0] = 40; qx[1] = 60; qy[1] = 35; qx[2] = 60; qy[2] = 45
32 var s2: i64 = pose_posture(qx, qy, cf, 50, 0, 1, 2)
33 if s2 == 1 { pass = pass + 1; gp("S2 horizontal -> 1 OK\n" as *u8) } else { gp("S2 FAIL=" as *u8); gn(s2); gp("\n" as *u8) }
34
35 // S3 INVERTED: neck(40,60), hips above at y=10 -> head-down
36 qx[0] = 40; qy[0] = 60; qx[1] = 30; qy[1] = 10; qx[2] = 50; qy[2] = 10
37 var s3: i64 = pose_posture(qx, qy, cf, 50, 0, 1, 2)
38 if s3 == 2 { pass = pass + 1; gp("S3 inverted -> 2 OK\n" as *u8) } else { gp("S3 FAIL=" as *u8); gn(s3); gp("\n" as *u8) }
39
40 // S4 UNKNOWN: neck confidence below threshold
41 qx[0] = 40; qy[0] = 10; cf[0] = 10
42 var s4: i64 = pose_posture(qx, qy, cf, 50, 0, 1, 2)
43 if s4 == 0-1 { pass = pass + 1; gp("S4 low-conf neck -> unknown OK\n" as *u8) } else { gp("S4 FAIL=" as *u8); gn(s4); gp("\n" as *u8) }
44 cf[0] = 100
45
46 // S5 MIDPOINT: mid of (30,60)/(50,60) -> (40,60)
47 qx[1] = 30; qy[1] = 60; qx[2] = 50; qy[2] = 60
48 var m5: i64 = pose_mid(qx, qy, cf, 1, 2, 50, ox, oy)
49 if m5 == 1 { if ox[0] == 40 { if oy[0] == 60 { pass = pass + 1; gp("S5 midpoint (40,60) OK\n" as *u8) } } }
50 if m5 != 1 { gp("S5 FAIL\n" as *u8) }
51
52 // S6 COMPACTNESS: a TALL skeleton (spanY>>spanX) -> high; a WIDE one -> ~0
53 i = 0; while i < 16 { cf[i] = 0; i = i + 1 }
54 cf[0] = 100; cf[1] = 100; cf[2] = 100
55 qx[0] = 40; qy[0] = 0; qx[1] = 40; qy[1] = 50; qx[2] = 40; qy[2] = 100
56 var tall: i64 = pose_compactness(qx, qy, cf, 3, 50)
57 qx[0] = 0; qy[0] = 40; qx[1] = 50; qy[1] = 40; qx[2] = 100; qy[2] = 40
58 var wide: i64 = pose_compactness(qx, qy, cf, 3, 50)
59 if tall > 1000 { if wide < 100 { pass = pass + 1; gp("S6 compactness tall(" as *u8); gn(tall); gp(") >> wide(" as *u8); gn(wide); gp(") OK\n" as *u8) } }
60 if tall <= 1000 { gp("S6 FAIL tall=" as *u8); gn(tall); gp("\n" as *u8) }
61
62 gp("POSE-SKELETON-GATE pass=" as *u8); gn(pass); gp("/6\n" as *u8)
63 if pass == 6 { gp("POSE-SKELETON-GATE GREEN 6/6 (upright/horizontal/inverted + unknown + midpoint + compactness)\n" as *u8); sys_exit(0) }
64 sys_exit(1)
65 return 0
66}