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}