code wiki / (root) / nx_pose_skeleton_gate.nx

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}