kinemotion 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kinemotion might be problematic. Click here for more details.

Files changed (31) hide show
  1. {kinemotion-0.1.0 → kinemotion-0.2.0}/CLAUDE.md +106 -48
  2. {kinemotion-0.1.0 → kinemotion-0.2.0}/PKG-INFO +162 -26
  3. {kinemotion-0.1.0 → kinemotion-0.2.0}/README.md +157 -21
  4. kinemotion-0.2.0/docs/PARAMETERS.md +1401 -0
  5. {kinemotion-0.1.0 → kinemotion-0.2.0}/pyproject.toml +7 -7
  6. kinemotion-0.2.0/src/kinemotion/__init__.py +3 -0
  7. {kinemotion-0.1.0/src/dropjump → kinemotion-0.2.0/src/kinemotion}/cli.py +141 -35
  8. kinemotion-0.2.0/src/kinemotion/core/__init__.py +40 -0
  9. kinemotion-0.2.0/src/kinemotion/core/filtering.py +345 -0
  10. kinemotion-0.2.0/src/kinemotion/core/pose.py +221 -0
  11. {kinemotion-0.1.0/src/dropjump → kinemotion-0.2.0/src/kinemotion/core}/smoothing.py +144 -0
  12. kinemotion-0.2.0/src/kinemotion/core/video_io.py +122 -0
  13. kinemotion-0.2.0/src/kinemotion/dropjump/__init__.py +29 -0
  14. kinemotion-0.1.0/src/dropjump/contact_detection.py → kinemotion-0.2.0/src/kinemotion/dropjump/analysis.py +81 -2
  15. kinemotion-0.1.0/src/dropjump/video_io.py → kinemotion-0.2.0/src/kinemotion/dropjump/debug_overlay.py +49 -140
  16. {kinemotion-0.1.0/src → kinemotion-0.2.0/src/kinemotion}/dropjump/kinematics.py +4 -1
  17. kinemotion-0.2.0/tests/test_adaptive_threshold.py +193 -0
  18. {kinemotion-0.1.0 → kinemotion-0.2.0}/tests/test_aspect_ratio.py +2 -1
  19. kinemotion-0.2.0/tests/test_com_estimation.py +165 -0
  20. {kinemotion-0.1.0 → kinemotion-0.2.0}/tests/test_contact_detection.py +1 -1
  21. kinemotion-0.2.0/tests/test_filtering.py +391 -0
  22. {kinemotion-0.1.0 → kinemotion-0.2.0}/tests/test_kinematics.py +2 -2
  23. kinemotion-0.2.0/tests/test_polyorder.py +149 -0
  24. kinemotion-0.1.0/docs/PARAMETERS.md +0 -622
  25. kinemotion-0.1.0/src/dropjump/__init__.py +0 -3
  26. kinemotion-0.1.0/src/dropjump/pose_tracker.py +0 -74
  27. {kinemotion-0.1.0 → kinemotion-0.2.0}/.gitignore +0 -0
  28. {kinemotion-0.1.0 → kinemotion-0.2.0}/.tool-versions +0 -0
  29. {kinemotion-0.1.0 → kinemotion-0.2.0}/LICENSE +0 -0
  30. {kinemotion-0.1.0 → kinemotion-0.2.0}/examples/programmatic_usage.py +0 -0
  31. {kinemotion-0.1.0 → kinemotion-0.2.0}/tests/__init__.py +0 -0
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
4
4
 
5
5
  ## Repository Purpose
6
6
 
7
- Kinemetry: Video-based kinematic analysis tool for athletic performance. Analyzes drop-jump videos to estimate ground contact time, flight time, and jump height by tracking athlete's feet using MediaPipe pose tracking and advanced kinematics.
7
+ Kinemotion: Video-based kinematic analysis tool for athletic performance. Analyzes drop-jump videos to estimate ground contact time, flight time, and jump height by tracking athlete's movement using MediaPipe pose tracking and advanced kinematics. Supports both foot-based tracking (traditional) and center of mass (CoM) tracking for improved accuracy.
8
8
 
9
9
  ## Project Setup
10
10
 
@@ -14,7 +14,7 @@ Managed with `uv` and `asdf`:
14
14
  - Python version: 3.12.7 (specified in `.tool-versions`)
15
15
  - **Important**: MediaPipe requires Python 3.12 or earlier (no 3.13 support yet)
16
16
  - Install dependencies: `uv sync`
17
- - Run CLI: `kinemetry dropjump-analyze <video.mp4>`
17
+ - Run CLI: `kinemotion dropjump-analyze <video.mp4>`
18
18
 
19
19
  **Production dependencies:**
20
20
  - click: CLI framework
@@ -31,64 +31,90 @@ Managed with `uv` and `asdf`:
31
31
 
32
32
  ### Development Commands
33
33
 
34
- - **Run tool**: `uv run kinemetry dropjump-analyze <video_path>`
34
+ - **Run tool**: `uv run kinemotion dropjump-analyze <video_path>`
35
35
  - **Install/sync deps**: `uv sync`
36
36
  - **Run tests**: `uv run pytest`
37
37
  - **Run specific test**: `uv run pytest tests/test_aspect_ratio.py -v`
38
38
  - **Format code**: `uv run black src/`
39
39
  - **Lint code**: `uv run ruff check`
40
40
  - **Auto-fix lint issues**: `uv run ruff check --fix`
41
- - **Type check**: `uv run mypy src/dropjump`
42
- - **Run all checks**: `uv run ruff check && uv run mypy src/dropjump && uv run pytest`
41
+ - **Type check**: `uv run mypy src/kinemotion`
42
+ - **Run all checks**: `uv run ruff check && uv run mypy src/kinemotion && uv run pytest`
43
43
 
44
44
  ## Architecture
45
45
 
46
46
  ### Module Structure
47
47
 
48
48
  ```
49
- src/dropjump/
50
- ├── cli.py # Click-based CLI entry point
51
- ├── pose_tracker.py # MediaPipe Pose integration
52
- ├── smoothing.py # Savitzky-Golay landmark smoothing
53
- ├── contact_detection.py # Ground contact state detection
54
- ├── kinematics.py # Metric calculations (contact time, flight time, jump height)
55
- └── video_io.py # Video processing and debug overlay rendering
49
+ src/kinemotion/
50
+ ├── __init__.py
51
+ ├── cli.py # Click-based CLI entry point
52
+ ├── core/ # Shared functionality across all jump types
53
+ ├── __init__.py
54
+ ├── pose.py # MediaPipe Pose integration + CoM
55
+ │ ├── smoothing.py # Savitzky-Golay landmark smoothing
56
+ │ └── filtering.py # Outlier rejection + bilateral filtering
57
+ └── dropjump/ # Drop jump specific analysis
58
+ ├── __init__.py
59
+ ├── analysis.py # Ground contact state detection
60
+ ├── kinematics.py # Drop jump metrics calculations
61
+ └── video_io.py # Video processing and debug overlay rendering
56
62
 
57
63
  tests/
64
+ ├── test_adaptive_threshold.py # Adaptive threshold tests
65
+ ├── test_aspect_ratio.py # Aspect ratio preservation tests
66
+ ├── test_com_estimation.py # Center of mass estimation tests
58
67
  ├── test_contact_detection.py # Contact detection unit tests
68
+ ├── test_filtering.py # Advanced filtering tests
59
69
  ├── test_kinematics.py # Metrics calculation tests
60
- └── test_aspect_ratio.py # Aspect ratio preservation tests
70
+ └── test_polyorder.py # Polynomial order tests
61
71
 
62
72
  docs/
63
- └── PARAMETERS.md # Comprehensive guide to all CLI parameters
73
+ └── PARAMETERS.md # Comprehensive guide to all CLI parameters
64
74
  ```
65
75
 
76
+ **Design Rationale:**
77
+ - `core/` contains shared code reusable across different jump types (CMJ, squat jumps, etc.)
78
+ - `dropjump/` contains drop jump specific logic and metrics
79
+ - Future jump types (CMJ, squat) will be sibling modules to `dropjump/`
80
+ - Single CLI with subcommands for different analysis types
81
+
66
82
  ### Analysis Pipeline
67
83
 
68
- 1. **Pose Tracking** (pose_tracker.py): MediaPipe extracts foot landmarks (ankles, heels, foot indices) from each frame
69
- 2. **Smoothing** (smoothing.py): Savitzky-Golay filter reduces jitter while preserving dynamics
70
- 3. **Contact Detection** (contact_detection.py): Analyzes vertical foot velocity to classify ground contact vs. flight
71
- 4. **Phase Identification**: Finds continuous ground contact and flight periods
84
+ 1. **Pose Tracking** (core/pose.py): MediaPipe extracts body landmarks from each frame
85
+ - Foot landmarks: ankles, heels, foot indices (for traditional foot-based tracking)
86
+ - Body landmarks: nose, shoulders, hips, knees (for CoM-based tracking)
87
+ - Total 13 landmarks tracked per frame
88
+ 2. **Center of Mass Estimation** (core/pose.py): Optional biomechanical CoM calculation
89
+ - Uses Dempster's body segment parameters for accurate weight distribution:
90
+ - Head: 8%, Trunk: 50%, Thighs: 20%, Legs: 10%, Feet: 3%
91
+ - Weighted average of segment positions for physics-based tracking
92
+ - More accurate than foot tracking as it tracks true body movement
93
+ - Reduces error from foot dorsiflexion/plantarflexion during flight
94
+ 3. **Smoothing** (core/smoothing.py): Savitzky-Golay filter reduces jitter while preserving dynamics
95
+ 4. **Contact Detection** (dropjump/analysis.py): Analyzes vertical position velocity to classify ground contact vs. flight
96
+ - Works with either foot positions or CoM positions
97
+ 5. **Phase Identification**: Finds continuous ground contact and flight periods
72
98
  - Automatically detects drop jumps vs regular jumps
73
99
  - For drop jumps: identifies standing on box → drop → ground contact → jump
74
- 5. **Sub-Frame Interpolation** (contact_detection.py): Estimates exact transition times
75
- - Computes velocity from Savitzky-Golay derivative (smoothing.py)
100
+ 6. **Sub-Frame Interpolation** (dropjump/analysis.py): Estimates exact transition times
101
+ - Computes velocity from Savitzky-Golay derivative (core/smoothing.py)
76
102
  - Linear interpolation of smooth velocity to find threshold crossings
77
103
  - Returns fractional frame indices (e.g., 48.78 instead of 49)
78
104
  - Reduces timing error from ±33ms to ±10ms at 30fps (60-70% improvement)
79
105
  - Eliminates false threshold crossings from velocity noise
80
- 6. **Trajectory Curvature Analysis** (contact_detection.py): Refines transitions
106
+ 7. **Trajectory Curvature Analysis** (dropjump/analysis.py): Refines transitions
81
107
  - Computes acceleration (second derivative) using Savitzky-Golay filter
82
108
  - Detects landing events by acceleration spikes (impact deceleration)
83
109
  - Identifies takeoff events by acceleration changes
84
110
  - Blends curvature-based refinement with velocity-based estimates (70/30)
85
111
  - Provides independent validation based on physical motion patterns
86
- 7. **Metrics Calculation** (kinematics.py):
112
+ 8. **Metrics Calculation** (dropjump/kinematics.py):
87
113
  - Ground contact time from phase duration (using fractional frames)
88
114
  - Flight time from phase duration (using fractional frames)
89
115
  - Jump height from position tracking with optional calibration
90
116
  - Fallback: kinematic estimate from flight time: h = (g × t²) / 8
91
- 7. **Output**: JSON metrics + optional debug video overlay
117
+ 9. **Output**: JSON metrics + optional debug video overlay with visualizations
92
118
 
93
119
  ### Key Design Decisions
94
120
 
@@ -116,7 +142,7 @@ The codebase enforces strict code quality standards using multiple tools:
116
142
  - `disallow_incomplete_defs`: Partial type hints not allowed
117
143
  - `warn_return_any`: Warns on Any return types
118
144
  - Third-party stubs: Ignores missing imports for cv2, mediapipe, scipy
119
- - Run with: `uv run mypy src/dropjump`
145
+ - Run with: `uv run mypy src/kinemotion`
120
146
 
121
147
  ### Linting with ruff
122
148
 
@@ -144,7 +170,7 @@ uv run black src/
144
170
  uv run ruff check --fix
145
171
 
146
172
  # Type check
147
- uv run mypy src/dropjump
173
+ uv run mypy src/kinemotion
148
174
 
149
175
  # Run tests
150
176
  uv run pytest
@@ -152,16 +178,16 @@ uv run pytest
152
178
 
153
179
  Or run all checks at once:
154
180
  ```bash
155
- uv run ruff check && uv run mypy src/dropjump && uv run pytest
181
+ uv run ruff check && uv run mypy src/kinemotion && uv run pytest
156
182
  ```
157
183
 
158
184
  ## Critical Implementation Details
159
185
 
160
- ### Aspect Ratio Preservation & SAR Handling (video_io.py)
186
+ ### Aspect Ratio Preservation & SAR Handling (dropjump/video_io.py)
161
187
 
162
188
  **IMPORTANT**: The tool preserves the exact aspect ratio of the source video, including SAR (Sample Aspect Ratio) metadata. No dimensions are hardcoded.
163
189
 
164
- #### VideoProcessor (`video_io.py:15-110`)
190
+ #### VideoProcessor (`dropjump/video_io.py:15-110`)
165
191
 
166
192
  - Reads the **first actual frame** to get true encoded dimensions (not OpenCV properties)
167
193
  - Critical for mobile videos with rotation metadata
@@ -186,7 +212,7 @@ self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
186
212
  self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
187
213
  ```
188
214
 
189
- #### DebugOverlayRenderer (`video_io.py:130-330`)
215
+ #### DebugOverlayRenderer (`dropjump/video_io.py:130-330`)
190
216
 
191
217
  - Creates output video with **display dimensions** (respecting SAR)
192
218
  - Resizes frames from encoded dimensions to display dimensions if needed (INTER_LANCZOS4)
@@ -353,7 +379,7 @@ Always convert to Python `int()` in `to_dict()` method:
353
379
  "contact_start_frame": self.contact_start_frame
354
380
  ```
355
381
 
356
- ### Video Codec Handling (video_io.py:78-94)
382
+ ### Video Codec Handling (dropjump/video_io.py:78-94)
357
383
 
358
384
  - Primary codec: H.264 (avc1) - better quality, smaller file size
359
385
  - Fallback codec: MPEG-4 (mp4v) - broader compatibility
@@ -378,37 +404,40 @@ Always be careful with dimension ordering to avoid squashed/stretched videos.
378
404
 
379
405
  ### Adding New Metrics
380
406
 
381
- 1. Update `DropJumpMetrics` class in `kinematics.py:10-19`
407
+ 1. Update `DropJumpMetrics` class in `dropjump/kinematics.py:10-19`
382
408
  2. Add calculation logic in `calculate_drop_jump_metrics()` function
383
409
  3. Update `to_dict()` method for JSON serialization (remember to convert NumPy types to Python types)
384
- 4. Optionally add visualization in `DebugOverlayRenderer.render_frame()` in `video_io.py:96`
410
+ 4. Optionally add visualization in `DebugOverlayRenderer.render_frame()` in `dropjump/video_io.py:96`
385
411
  5. Add tests in `tests/test_kinematics.py`
386
412
 
387
413
  ### Modifying Contact Detection Logic
388
414
 
389
- Edit `detect_ground_contact()` in `contact_detection.py:14`. Key parameters:
415
+ Edit `detect_ground_contact()` in `dropjump/analysis.py:14`. Key parameters:
390
416
  - `velocity_threshold`: Tune for different surface/athlete combinations (default: 0.02)
391
417
  - `min_contact_frames`: Adjust for frame rate and contact duration expectations (default: 3)
392
418
  - `visibility_threshold`: Minimum landmark visibility score (default: 0.5)
393
419
 
394
420
  ### Adjusting Smoothing
395
421
 
396
- Modify `smooth_landmarks()` in `smoothing.py:9`:
422
+ Modify `smooth_landmarks()` in `core/smoothing.py:9`:
397
423
  - `window_length`: Controls smoothing strength (must be odd, default: 5)
398
424
  - `polyorder`: Polynomial order for Savitzky-Golay filter (default: 2)
399
425
 
400
426
  ### Parameter Tuning
401
427
 
402
- **IMPORTANT**: See `docs/PARAMETERS.md` for comprehensive guide on all 7 CLI parameters.
428
+ **IMPORTANT**: See `docs/PARAMETERS.md` for comprehensive guide on all CLI parameters.
403
429
 
404
430
  Quick reference:
431
+ - **use-com**: Use center of mass tracking instead of feet (↑ accuracy by 3-5%)
432
+ - **adaptive-threshold**: Auto-calibrate velocity threshold from baseline (↑ accuracy by 2-3%)
405
433
  - **smoothing-window**: Trajectory smoothness (↑ for noisy video)
406
- - **velocity-threshold**: Contact sensitivity (↓ to detect brief contacts)
434
+ - **velocity-threshold**: Contact sensitivity (↓ to detect brief contacts) - ignored if adaptive-threshold enabled
407
435
  - **min-contact-frames**: Temporal filter (↑ to remove false contacts)
408
- - **visibility-threshold**: Landmark confidence (↓ for occluded feet)
436
+ - **visibility-threshold**: Landmark confidence (↓ for occluded landmarks)
409
437
  - **detection-confidence**: Pose detection strictness (MediaPipe)
410
438
  - **tracking-confidence**: Tracking persistence (MediaPipe)
411
439
  - **drop-height**: Drop box height in meters for calibration (e.g., 0.40 for 40cm)
440
+ - **use-curvature**: Enable trajectory curvature analysis (default: enabled)
412
441
 
413
442
  The detailed guide includes:
414
443
  - How each parameter works internally
@@ -448,6 +477,8 @@ uv run pytest -v
448
477
 
449
478
  - **Aspect ratio preservation**: 4 tests covering 16:9, 4:3, 9:16, and validation
450
479
  - **Contact detection**: 3 tests for ground contact detection and phase identification
480
+ - **Center of mass estimation**: 6 tests for CoM calculation, biomechanical weights, and fallback behavior
481
+ - **Adaptive thresholding**: 10 tests for auto-calibration, noise adaptation, bounds checking, and edge cases
451
482
  - **Kinematics**: 2 tests for metrics calculation and JSON serialization
452
483
 
453
484
  ### Code Quality
@@ -455,7 +486,7 @@ uv run pytest -v
455
486
  All code passes:
456
487
  - ✅ **Type checking**: Full mypy strict mode compliance
457
488
  - ✅ **Linting**: ruff checks with comprehensive rule sets
458
- - ✅ **Tests**: 9/9 tests passing
489
+ - ✅ **Tests**: 25/25 tests passing
459
490
  - ✅ **Formatting**: Black code style
460
491
 
461
492
  ## Troubleshooting
@@ -494,46 +525,73 @@ If mypy reports errors:
494
525
  2. For numpy types, use explicit casts: `int()`, `float()` when converting to Python types
495
526
  3. For third-party libraries without stubs (cv2, mediapipe, scipy), use `# type: ignore` comments sparingly
496
527
  4. Check `pyproject.toml` under `[tool.mypy]` for configuration
497
- 5. Run `uv run mypy src/dropjump` to verify fixes
528
+ 5. Run `uv run mypy src/kinemotion` to verify fixes
498
529
 
499
530
  ## CLI Usage Examples
500
531
 
501
532
  ```bash
502
533
  # Show main command help
503
- uv run kinemetry --help
534
+ uv run kinemotion --help
504
535
 
505
536
  # Show subcommand help
506
- uv run kinemetry dropjump-analyze --help
537
+ uv run kinemotion dropjump-analyze --help
507
538
 
508
539
  # Basic analysis (JSON to stdout)
509
- uv run kinemetry dropjump-analyze video.mp4
540
+ uv run kinemotion dropjump-analyze video.mp4
510
541
 
511
542
  # Save metrics to file
512
- uv run kinemetry dropjump-analyze video.mp4 --json-output results.json
543
+ uv run kinemotion dropjump-analyze video.mp4 --json-output results.json
513
544
 
514
545
  # Generate debug video
515
- uv run kinemetry dropjump-analyze video.mp4 --output debug.mp4
546
+ uv run kinemotion dropjump-analyze video.mp4 --output debug.mp4
516
547
 
517
548
  # Drop jump with calibration (40cm box)
518
- uv run kinemetry dropjump-analyze video.mp4 --drop-height 0.40
549
+ uv run kinemotion dropjump-analyze video.mp4 --drop-height 0.40
519
550
 
520
551
  # Custom parameters for noisy video
521
- uv run kinemetry dropjump-analyze video.mp4 \
552
+ uv run kinemotion dropjump-analyze video.mp4 \
522
553
  --smoothing-window 7 \
523
554
  --velocity-threshold 0.01 \
524
555
  --min-contact-frames 5
525
556
 
526
557
  # Full analysis with calibration and all outputs
527
- uv run kinemetry dropjump-analyze video.mp4 \
558
+ uv run kinemotion dropjump-analyze video.mp4 \
528
559
  --output debug.mp4 \
529
560
  --json-output metrics.json \
530
561
  --drop-height 0.40 \
531
562
  --smoothing-window 7
532
563
 
533
564
  # Regular jump (no calibration, uses corrected kinematic method)
534
- uv run kinemetry dropjump-analyze jump.mp4 \
565
+ uv run kinemotion dropjump-analyze jump.mp4 \
566
+ --output debug.mp4 \
567
+ --json-output metrics.json
568
+
569
+ # Use center of mass tracking for improved accuracy (3-5% gain)
570
+ uv run kinemotion dropjump-analyze video.mp4 \
571
+ --use-com \
535
572
  --output debug.mp4 \
536
573
  --json-output metrics.json
574
+
575
+ # Full analysis with CoM tracking and calibration
576
+ uv run kinemotion dropjump-analyze video.mp4 \
577
+ --use-com \
578
+ --drop-height 0.40 \
579
+ --output debug_com.mp4 \
580
+ --json-output metrics.json
581
+
582
+ # Adaptive threshold for auto-calibration (2-3% accuracy gain)
583
+ uv run kinemotion dropjump-analyze video.mp4 \
584
+ --adaptive-threshold \
585
+ --output debug.mp4 \
586
+ --json-output metrics.json
587
+
588
+ # Maximum accuracy: CoM + adaptive threshold + calibration (~93-96%)
589
+ uv run kinemotion dropjump-analyze video.mp4 \
590
+ --adaptive-threshold \
591
+ --use-com \
592
+ --drop-height 0.40 \
593
+ --output debug_max.mp4 \
594
+ --json-output metrics.json
537
595
  ```
538
596
 
539
597
  ## MCP Server Configuration
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinemotion
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Video-based kinematic analysis for athletic performance
5
- Project-URL: Homepage, https://github.com/feniix/kinemetry
6
- Project-URL: Repository, https://github.com/feniix/kinemetry
7
- Project-URL: Issues, https://github.com/feniix/kinemetry/issues
5
+ Project-URL: Homepage, https://github.com/feniix/kinemotion
6
+ Project-URL: Repository, https://github.com/feniix/kinemotion
7
+ Project-URL: Issues, https://github.com/feniix/kinemotion/issues
8
8
  Author-email: Sebastian Otaegui <feniix@gmail.com>
9
9
  License: MIT
10
10
  License-File: LICENSE
11
- Keywords: athletic-performance,drop-jump,kinemetry,mediapipe,pose-tracking,video-analysis
11
+ Keywords: athletic-performance,drop-jump,kinemetry,kinemotion,mediapipe,pose-tracking,video-analysis
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Intended Audience :: Science/Research
14
14
  Classifier: License :: OSI Approved :: MIT License
@@ -26,14 +26,16 @@ Requires-Dist: opencv-python>=4.9.0
26
26
  Requires-Dist: scipy>=1.11.0
27
27
  Description-Content-Type: text/markdown
28
28
 
29
- # Kinemetry
29
+ # Kinemotion
30
30
 
31
31
  A video-based kinematic analysis tool for athletic performance. Analyzes side-view drop-jump videos to estimate key performance metrics: ground contact time, flight time, and jump height. Uses MediaPipe pose tracking and advanced kinematics.
32
32
 
33
33
  ## Features
34
34
 
35
35
  - **Automatic pose tracking** using MediaPipe Pose landmarks
36
- - **Ground contact detection** based on foot velocity and position
36
+ - **Center of mass (CoM) tracking** - biomechanical CoM estimation for 3-5% accuracy improvement
37
+ - **Adaptive velocity thresholding** - auto-calibrates from video baseline for 2-3% additional accuracy
38
+ - **Ground contact detection** based on velocity and position (feet or CoM)
37
39
  - **Derivative-based velocity** - smooth velocity calculation from position trajectory
38
40
  - **Trajectory curvature analysis** - acceleration patterns for refined event detection
39
41
  - **Sub-frame interpolation** - precise timing beyond frame boundaries for improved accuracy
@@ -43,6 +45,8 @@ A video-based kinematic analysis tool for athletic performance. Analyzes side-vi
43
45
  - Flight time (ms)
44
46
  - Jump height (m) - with optional calibration using drop box height
45
47
  - **Calibrated measurements** - use known drop height for ~88% accuracy (vs 71% uncalibrated)
48
+ - With CoM tracking: potential for 91-93% accuracy
49
+ - With adaptive thresholding + CoM: potential for 93-96% accuracy
46
50
  - **JSON output** for easy integration with other tools
47
51
  - **Optional debug video** with visual overlays showing contact states and landmarks
48
52
  - **Configurable parameters** for smoothing, thresholds, and detection
@@ -75,7 +79,7 @@ asdf install
75
79
  uv sync
76
80
  ```
77
81
 
78
- This will install all dependencies and make the `kinemetry` command available.
82
+ This will install all dependencies and make the `kinemotion` command available.
79
83
 
80
84
  ## Usage
81
85
 
@@ -84,13 +88,13 @@ This will install all dependencies and make the `kinemetry` command available.
84
88
  Analyze a video and output metrics to stdout as JSON:
85
89
 
86
90
  ```bash
87
- kinemetry dropjump-analyze video.mp4
91
+ kinemotion dropjump-analyze video.mp4
88
92
  ```
89
93
 
90
94
  ### Save Metrics to File
91
95
 
92
96
  ```bash
93
- kinemetry dropjump-analyze video.mp4 --json-output metrics.json
97
+ kinemotion dropjump-analyze video.mp4 --json-output metrics.json
94
98
  ```
95
99
 
96
100
  ### Generate Debug Video
@@ -98,7 +102,7 @@ kinemetry dropjump-analyze video.mp4 --json-output metrics.json
98
102
  Create an annotated video showing pose tracking and contact detection:
99
103
 
100
104
  ```bash
101
- kinemetry dropjump-analyze video.mp4 --output debug.mp4
105
+ kinemotion dropjump-analyze video.mp4 --output debug.mp4
102
106
  ```
103
107
 
104
108
  ### Calibrated Drop Jump Analysis
@@ -107,24 +111,71 @@ For most accurate measurements, provide the drop box height in meters:
107
111
 
108
112
  ```bash
109
113
  # 40cm drop box
110
- kinemetry dropjump-analyze drop-jump.mp4 --drop-height 0.40
114
+ kinemotion dropjump-analyze drop-jump.mp4 --drop-height 0.40
111
115
 
112
116
  # 60cm drop box with full outputs
113
- kinemetry dropjump-analyze drop-jump.mp4 \
117
+ kinemotion dropjump-analyze drop-jump.mp4 \
114
118
  --drop-height 0.60 \
115
119
  --json-output metrics.json \
116
120
  --output debug.mp4
117
121
  ```
118
122
 
119
- ### Full Example
123
+ ### Center of Mass Tracking (Improved Accuracy)
124
+
125
+ Use CoM tracking for 3-5% accuracy improvement:
120
126
 
121
127
  ```bash
122
- kinemetry dropjump-analyze jump.mp4 \
123
- --json-output results.json \
128
+ # Basic CoM tracking
129
+ kinemotion dropjump-analyze video.mp4 --use-com
130
+
131
+ # CoM tracking with calibration for maximum accuracy
132
+ kinemotion dropjump-analyze drop-jump.mp4 \
133
+ --use-com \
134
+ --drop-height 0.40 \
135
+ --output debug_com.mp4 \
136
+ --json-output metrics.json
137
+ ```
138
+
139
+ ### Adaptive Thresholding (Auto-Calibration)
140
+
141
+ Auto-calibrate velocity threshold from video baseline for 2-3% accuracy improvement:
142
+
143
+ ```bash
144
+ # Basic adaptive thresholding
145
+ kinemotion dropjump-analyze video.mp4 --adaptive-threshold
146
+
147
+ # Combined with CoM for maximum accuracy
148
+ kinemotion dropjump-analyze video.mp4 \
149
+ --adaptive-threshold \
150
+ --use-com \
151
+ --drop-height 0.40 \
124
152
  --output debug.mp4 \
153
+ --json-output metrics.json
154
+ ```
155
+
156
+ ### Full Example (Maximum Accuracy)
157
+
158
+ ```bash
159
+ # With all accuracy improvements enabled (~93-96% accuracy)
160
+ kinemotion dropjump-analyze jump.mp4 \
161
+ --adaptive-threshold \
162
+ --use-com \
163
+ --outlier-rejection \
125
164
  --drop-height 0.40 \
165
+ --output debug.mp4 \
166
+ --json-output results.json \
126
167
  --smoothing-window 7 \
127
- --velocity-threshold 0.015
168
+ --polyorder 3
169
+
170
+ # Alternative: With experimental bilateral filter
171
+ kinemotion dropjump-analyze jump.mp4 \
172
+ --adaptive-threshold \
173
+ --use-com \
174
+ --outlier-rejection \
175
+ --bilateral-filter \
176
+ --drop-height 0.40 \
177
+ --output debug.mp4 \
178
+ --json-output results.json
128
179
  ```
129
180
 
130
181
  ## Configuration Options
@@ -146,6 +197,43 @@ kinemetry dropjump-analyze jump.mp4 \
146
197
  - Larger values = smoother trajectories but less responsive
147
198
  - **Tip**: Increase for noisy videos, decrease for high-quality stable footage
148
199
 
200
+ - `--polyorder <int>` (default: 2)
201
+ - Polynomial order for Savitzky-Golay smoothing filter
202
+ - Must be < smoothing-window (typically 2 or 3)
203
+ - 2 = quadratic fit (good for parabolic motion like jumps)
204
+ - 3 = cubic fit (better for complex motion patterns)
205
+ - Higher order captures more motion complexity but more sensitive to noise
206
+ - **Tip**: Use 2 for most cases, try 3 for high-quality videos with complex motion
207
+ - **Accuracy improvement**: +1-2% for complex motion patterns
208
+
209
+ ### Advanced Filtering
210
+
211
+ - `--outlier-rejection / --no-outlier-rejection` (default: --outlier-rejection)
212
+ - Apply RANSAC and median-based outlier rejection to remove tracking glitches
213
+ - **With outlier rejection** (`--outlier-rejection`): Detects and removes MediaPipe tracking errors
214
+ - RANSAC-based polynomial fitting identifies positions that deviate from smooth trajectory
215
+ - Median filtering catches spikes in otherwise smooth motion
216
+ - Outliers replaced with interpolated values from neighboring valid points
217
+ - Removes jumps, jitter, and temporary tracking losses
218
+ - **Accuracy improvement**: +1-2% by eliminating tracking glitches
219
+ - **Without outlier rejection** (`--no-outlier-rejection`): Uses raw tracked positions
220
+ - Faster processing, relies entirely on MediaPipe quality
221
+ - **Tip**: Keep enabled (default) unless debugging or working with perfect tracking
222
+
223
+ - `--bilateral-filter / --no-bilateral-filter` (default: --no-bilateral-filter)
224
+ - Use bilateral temporal filter for edge-preserving smoothing
225
+ - **With bilateral filter** (`--bilateral-filter`): Preserves sharp transitions while smoothing noise
226
+ - Weights each frame by temporal distance AND position similarity
227
+ - Landing/takeoff transitions remain sharp (not smoothed away)
228
+ - Noise in smooth regions (flight, ground contact) is reduced
229
+ - Edge-preserving alternative to Savitzky-Golay smoothing
230
+ - **Accuracy improvement**: +1-2% by preserving event timing precision
231
+ - **Without bilateral filter** (`--no-bilateral-filter`): Uses standard Savitzky-Golay smoothing
232
+ - Uniform smoothing across all frames
233
+ - Well-tested baseline method
234
+ - **Tip**: Experimental feature; enable for videos with rapid transitions or variable motion
235
+ - **Note**: Cannot be used simultaneously with Savitzky-Golay; bilateral replaces it when enabled
236
+
149
237
  ### Contact Detection
150
238
 
151
239
  - `--velocity-threshold <float>` (default: 0.02)
@@ -186,6 +274,49 @@ kinemetry dropjump-analyze jump.mp4 \
186
274
  - Only applicable for drop jumps (box → drop → landing → jump)
187
275
  - **Tip**: Measure your box height accurately for best results
188
276
 
277
+ ### Tracking Method
278
+
279
+ - `--use-com / --use-feet` (default: --use-feet)
280
+ - Choose between center of mass (CoM) or foot-based tracking
281
+ - **CoM tracking** (`--use-com`): Uses biomechanical CoM estimation with Dempster's body segment parameters
282
+ - Head: 8%, Trunk: 50%, Thighs: 20%, Legs: 10%, Feet: 3% of body mass
283
+ - Tracks true body movement instead of foot position
284
+ - Reduces error from foot dorsiflexion/plantarflexion during flight
285
+ - **Accuracy improvement**: +3-5% over foot-based tracking
286
+ - **Foot tracking** (`--use-feet`): Traditional method using average ankle/heel positions
287
+ - Faster, simpler, well-tested baseline method
288
+ - **Tip**: Use `--use-com` for maximum accuracy, especially for drop jumps
289
+
290
+ ### Velocity Threshold Mode
291
+
292
+ - `--adaptive-threshold / --fixed-threshold` (default: --fixed-threshold)
293
+ - Choose between adaptive or fixed velocity threshold for contact detection
294
+ - **Adaptive threshold** (`--adaptive-threshold`): Auto-calibrates from video baseline
295
+ - Analyzes first 3 seconds of video (assumed relatively stationary)
296
+ - Computes noise floor as 95th percentile of baseline velocity
297
+ - Sets threshold as 1.5× noise floor (bounded: 0.005-0.05)
298
+ - Adapts to camera distance, lighting, frame rate, and compression artifacts
299
+ - **Accuracy improvement**: +2-3% by eliminating manual tuning
300
+ - **Fixed threshold** (`--fixed-threshold`): Uses `--velocity-threshold` value (default: 0.02)
301
+ - Consistent, predictable behavior
302
+ - Requires manual tuning for optimal results
303
+ - **Tip**: Use `--adaptive-threshold` for varying video conditions or when unsure of optimal threshold
304
+
305
+ ### Trajectory Analysis
306
+
307
+ - `--use-curvature / --no-curvature` (default: --use-curvature)
308
+ - Enable/disable trajectory curvature analysis for refining transitions
309
+ - **With curvature** (`--use-curvature`): Uses acceleration patterns to refine event timing
310
+ - Landing detection: Finds acceleration spike from impact deceleration
311
+ - Takeoff detection: Finds acceleration change as body transitions from static to upward motion
312
+ - Blends curvature-based refinement (70%) with velocity-based estimate (30%)
313
+ - Provides physics-based validation of velocity threshold crossings
314
+ - **Accuracy improvement**: More precise timing, especially for rapid transitions
315
+ - **Without curvature** (`--no-curvature`): Pure velocity-based detection with sub-frame interpolation
316
+ - Simpler, faster algorithm
317
+ - Still highly accurate with smooth velocity curves
318
+ - **Tip**: Keep enabled (default) for best results; disable only for debugging or comparison
319
+
189
320
  ## Output Format
190
321
 
191
322
  ### JSON Metrics
@@ -281,24 +412,29 @@ The debug video includes:
281
412
 
282
413
  ## How It Works
283
414
 
284
- 1. **Pose Tracking**: MediaPipe extracts 2D pose landmarks (ankles, heels, foot indices) from each frame
285
- 2. **Smoothing**: Savitzky-Golay filter reduces tracking jitter while preserving motion dynamics
286
- 3. **Contact Detection**: Analyzes vertical foot velocity to identify ground contact vs. flight phases
287
- 4. **Phase Identification**: Finds continuous ground contact and flight periods
415
+ 1. **Pose Tracking**: MediaPipe extracts 2D pose landmarks (13 points: feet, ankles, knees, hips, shoulders, nose) from each frame
416
+ 2. **Position Calculation**: Two methods available:
417
+ - **Foot-based** (default): Averages ankle, heel, and foot index positions
418
+ - **CoM-based** (--use-com): Biomechanical center of mass using Dempster's body segment parameters
419
+ - Head: 8%, Trunk: 50%, Thighs: 20%, Legs: 10%, Feet: 3% of body mass
420
+ - Weighted average reduces error from foot movement artifacts
421
+ 3. **Smoothing**: Savitzky-Golay filter reduces tracking jitter while preserving motion dynamics
422
+ 4. **Contact Detection**: Analyzes vertical position velocity to identify ground contact vs. flight phases
423
+ 5. **Phase Identification**: Finds continuous ground contact and flight periods
288
424
  - Automatically detects drop jumps vs regular jumps
289
425
  - For drop jumps: identifies box → drop → ground contact → jump sequence
290
- 5. **Sub-Frame Interpolation**: Estimates exact transition times between frames
426
+ 6. **Sub-Frame Interpolation**: Estimates exact transition times between frames
291
427
  - Uses Savitzky-Golay derivative for smooth velocity calculation
292
428
  - Linear interpolation of velocity to find threshold crossings
293
429
  - Achieves sub-millisecond timing precision (at 30fps: ±10ms vs ±33ms)
294
430
  - Reduces timing error by 60-70% for contact and flight measurements
295
431
  - Smoother velocity curves eliminate false threshold crossings
296
- 6. **Trajectory Curvature Analysis**: Refines transitions using acceleration patterns
432
+ 7. **Trajectory Curvature Analysis**: Refines transitions using acceleration patterns
297
433
  - Computes second derivative (acceleration) from position trajectory
298
434
  - Detects landing impact by acceleration spike
299
435
  - Identifies takeoff by acceleration change patterns
300
436
  - Provides independent validation and refinement of velocity-based detection
301
- 7. **Metric Calculation**:
437
+ 8. **Metric Calculation**:
302
438
  - Ground contact time = contact phase duration (using fractional frames)
303
439
  - Flight time = flight phase duration (using fractional frames)
304
440
  - Jump height = calibrated position-based measurement (if --drop-height provided)
@@ -312,13 +448,13 @@ This project enforces strict code quality standards:
312
448
  - **Type safety**: Full mypy strict mode compliance with complete type annotations
313
449
  - **Linting**: Comprehensive ruff checks (pycodestyle, pyflakes, isort, pep8-naming, etc.)
314
450
  - **Formatting**: Black code style
315
- - **Testing**: pytest with 9 unit tests
451
+ - **Testing**: pytest with 25 unit tests
316
452
 
317
453
  ### Development Commands
318
454
 
319
455
  ```bash
320
456
  # Run the tool
321
- uv run kinemetry dropjump-analyze <video_path>
457
+ uv run kinemotion dropjump-analyze <video_path>
322
458
 
323
459
  # Run all tests
324
460
  uv run pytest