code wiki / (root) / nx_motion_test.nx

nx_motion_test.nx source

↩ module page · 75 lines · 2764 B

1// nx_motion_test.nx -- smoke for nx_motion primitives. 2 3import "syscalls.nx" 4import "nx_image.nx" 5import "nx_motion.nx" 6 7func main() -> i64 { 8 // === Test 1: frame difference === 9 let f1: *Image = nx_image_alloc(8, 8, 1) 10 let f2: *Image = nx_image_alloc(8, 8, 1) 11 var y: i64 = 0 12 while y < 8 { 13 var x: i64 = 0 14 while x < 8 { 15 nx_image_set(f1, x, y, 0, 100) 16 nx_image_set(f2, x, y, 0, 120) 17 x = x + 1 18 } 19 y = y + 1 20 } 21 let diff: *Image = nx_motion_frame_diff(f1, f2) 22 if nx_image_get(diff, 3, 3, 0) != 20 { return 1 } 23 24 // === Test 2: identical frames -> zero diff === 25 let diff2: *Image = nx_motion_frame_diff(f1, f1) 26 if nx_image_get(diff2, 3, 3, 0) != 0 { return 2 } 27 28 // === Test 3: temporal gradient (frame2 - frame1) === 29 let It: *ImageS64 = nx_motion_temporal_grad(f1, f2) 30 if nx_image_s64_get(It, 3, 3) != 20 { return 10 } 31 // Reverse: frame1 - frame2 should give -20. 32 let It2: *ImageS64 = nx_motion_temporal_grad(f2, f1) 33 if nx_image_s64_get(It2, 3, 3) != -20 { return 11 } 34 35 // === Test 4: Lucas-Kanade on shifted vertical edge === 36 // Frame 1: vertical edge at x=8 (left dark, right bright). 37 // Frame 2: vertical edge at x=10 (shifted 2 right). 38 // Expected u > 0 (positive horizontal flow) at the edge in frame 1. 39 let img1: *Image = nx_image_alloc(20, 12, 1) 40 let img2: *Image = nx_image_alloc(20, 12, 1) 41 var y3: i64 = 0 42 while y3 < 12 { 43 var x3: i64 = 0 44 while x3 < 20 { 45 var v1: i64 = 0 46 if x3 >= 8 { v1 = 200 } 47 nx_image_set(img1, x3, y3, 0, v1) 48 var v2: i64 = 0 49 if x3 >= 10 { v2 = 200 } 50 nx_image_set(img2, x3, y3, 0, v2) 51 x3 = x3 + 1 52 } 53 y3 = y3 + 1 54 } 55 let flow: *FlowField = nx_motion_lucas_kanade(img1, img2) 56 // At the edge of frame 1 (around x=7 or 8), flow_u should be positive. 57 let u_at_edge: i64 = nx_image_s64_get(flow.u, 7, 6) 58 // Should be > 0 (object moved right) 59 if u_at_edge <= 0 { return 20 } 60 61 // === Test 5: mean flow points right (positive u) === 62 let mu: *i64 = (sys_mmap(8)) as *i64 63 let mv: *i64 = (sys_mmap(8)) as *i64 64 let n_confident: i64 = nx_motion_mean_flow(flow, 10, mu, mv) 65 if n_confident <= 0 { return 30 } 66 // Mean u should be positive (moving right). 67 if mu[0] <= 0 { return 31 } 68 69 // === Test 6: identical frames -> zero flow everywhere === 70 let flow_zero: *FlowField = nx_motion_lucas_kanade(img1, img1) 71 if nx_image_s64_get(flow_zero.u, 5, 5) != 0 { return 40 } 72 if nx_image_s64_get(flow_zero.v, 5, 5) != 0 { return 41 } 73 74 return 0 75}