kinemotion 0.22.1__tar.gz → 0.23.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 (93) hide show
  1. {kinemotion-0.22.1 → kinemotion-0.23.0}/CHANGELOG.md +8 -0
  2. {kinemotion-0.22.1 → kinemotion-0.23.0}/PKG-INFO +1 -1
  3. {kinemotion-0.22.1 → kinemotion-0.23.0}/pyproject.toml +1 -1
  4. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/dropjump/analysis.py +17 -7
  5. {kinemotion-0.22.1 → kinemotion-0.23.0}/uv.lock +1 -1
  6. {kinemotion-0.22.1 → kinemotion-0.23.0}/.dockerignore +0 -0
  7. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  8. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  9. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  10. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/pull_request_template.md +0 -0
  11. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/workflows/docs.yml +0 -0
  12. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/workflows/release.yml +0 -0
  13. {kinemotion-0.22.1 → kinemotion-0.23.0}/.github/workflows/test.yml +0 -0
  14. {kinemotion-0.22.1 → kinemotion-0.23.0}/.gitignore +0 -0
  15. {kinemotion-0.22.1 → kinemotion-0.23.0}/.pre-commit-config.yaml +0 -0
  16. {kinemotion-0.22.1 → kinemotion-0.23.0}/.readthedocs.yml +0 -0
  17. {kinemotion-0.22.1 → kinemotion-0.23.0}/.tool-versions +0 -0
  18. {kinemotion-0.22.1 → kinemotion-0.23.0}/CLAUDE.md +0 -0
  19. {kinemotion-0.22.1 → kinemotion-0.23.0}/CODE_OF_CONDUCT.md +0 -0
  20. {kinemotion-0.22.1 → kinemotion-0.23.0}/CONTRIBUTING.md +0 -0
  21. {kinemotion-0.22.1 → kinemotion-0.23.0}/Dockerfile +0 -0
  22. {kinemotion-0.22.1 → kinemotion-0.23.0}/GEMINI.md +0 -0
  23. {kinemotion-0.22.1 → kinemotion-0.23.0}/LICENSE +0 -0
  24. {kinemotion-0.22.1 → kinemotion-0.23.0}/README.md +0 -0
  25. {kinemotion-0.22.1 → kinemotion-0.23.0}/SECURITY.md +0 -0
  26. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/README.md +0 -0
  27. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/api/cmj.md +0 -0
  28. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/api/core.md +0 -0
  29. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/api/dropjump.md +0 -0
  30. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/api/overview.md +0 -0
  31. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/development/errors-findings.md +0 -0
  32. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/development/testing.md +0 -0
  33. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/development/type-hints.md +0 -0
  34. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/development/validation-plan.md +0 -0
  35. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/development/wallball-norep-detection.md +0 -0
  36. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/guides/bulk-processing.md +0 -0
  37. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/guides/camera-setup.md +0 -0
  38. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/guides/cmj-guide.md +0 -0
  39. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/index.md +0 -0
  40. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/reference/parameters.md +0 -0
  41. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/reference/pose-systems.md +0 -0
  42. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
  43. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/technical/framerate.md +0 -0
  44. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/technical/implementation-details.md +0 -0
  45. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/technical/imu-metadata.md +0 -0
  46. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/technical/real-time-analysis.md +0 -0
  47. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/technical/triple-extension.md +0 -0
  48. {kinemotion-0.22.1 → kinemotion-0.23.0}/docs/translations/es/camera-setup.md +0 -0
  49. {kinemotion-0.22.1 → kinemotion-0.23.0}/examples/bulk/README.md +0 -0
  50. {kinemotion-0.22.1 → kinemotion-0.23.0}/examples/bulk/bulk_processing.py +0 -0
  51. {kinemotion-0.22.1 → kinemotion-0.23.0}/examples/bulk/simple_example.py +0 -0
  52. {kinemotion-0.22.1 → kinemotion-0.23.0}/examples/programmatic_usage.py +0 -0
  53. {kinemotion-0.22.1 → kinemotion-0.23.0}/mkdocs.yml +0 -0
  54. {kinemotion-0.22.1 → kinemotion-0.23.0}/requirements-docs.txt +0 -0
  55. {kinemotion-0.22.1 → kinemotion-0.23.0}/samples/cmjs/README.md +0 -0
  56. {kinemotion-0.22.1 → kinemotion-0.23.0}/sonar-project.properties +0 -0
  57. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/__init__.py +0 -0
  58. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/api.py +0 -0
  59. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cli.py +0 -0
  60. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cmj/__init__.py +0 -0
  61. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cmj/analysis.py +0 -0
  62. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cmj/cli.py +0 -0
  63. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
  64. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cmj/joint_angles.py +0 -0
  65. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/cmj/kinematics.py +0 -0
  66. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/__init__.py +0 -0
  67. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/auto_tuning.py +0 -0
  68. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/cli_utils.py +0 -0
  69. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
  70. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/filtering.py +0 -0
  71. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/pose.py +0 -0
  72. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/smoothing.py +0 -0
  73. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/core/video_io.py +0 -0
  74. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/dropjump/__init__.py +0 -0
  75. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/dropjump/cli.py +0 -0
  76. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
  77. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/dropjump/kinematics.py +0 -0
  78. {kinemotion-0.22.1 → kinemotion-0.23.0}/src/kinemotion/py.typed +0 -0
  79. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/__init__.py +0 -0
  80. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_adaptive_threshold.py +0 -0
  81. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_api.py +0 -0
  82. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_aspect_ratio.py +0 -0
  83. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_cli_cmj.py +0 -0
  84. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_cli_dropjump.py +0 -0
  85. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_cli_imports.py +0 -0
  86. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_cmj_analysis.py +0 -0
  87. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_cmj_kinematics.py +0 -0
  88. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_com_estimation.py +0 -0
  89. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_contact_detection.py +0 -0
  90. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_filtering.py +0 -0
  91. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_joint_angles.py +0 -0
  92. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_kinematics.py +0 -0
  93. {kinemotion-0.22.1 → kinemotion-0.23.0}/tests/test_polyorder.py +0 -0
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  <!-- version list -->
9
9
 
10
+ ## v0.23.0 (2025-11-10)
11
+
12
+ ### Features
13
+
14
+ - Extract visibility calculation helper to improve code maintainability
15
+ ([`2839d6e`](https://github.com/feniix/kinemotion/commit/2839d6eca4b4f6ff8b6247501560939953282943))
16
+
17
+
10
18
  ## v0.22.1 (2025-11-10)
11
19
 
12
20
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinemotion
3
- Version: 0.22.1
3
+ Version: 0.23.0
4
4
  Summary: Video-based kinematic analysis for athletic performance
5
5
  Project-URL: Homepage, https://github.com/feniix/kinemotion
6
6
  Project-URL: Repository, https://github.com/feniix/kinemotion
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kinemotion"
3
- version = "0.22.1"
3
+ version = "0.23.0"
4
4
  description = "Video-based kinematic analysis for athletic performance"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.13"
@@ -754,6 +754,22 @@ def compute_average_foot_position(
754
754
  return (float(np.mean(x_positions)), float(np.mean(y_positions)))
755
755
 
756
756
 
757
+ def _calculate_average_visibility(
758
+ frame_landmarks: dict[str, tuple[float, float, float]],
759
+ ) -> float:
760
+ """Calculate average visibility of foot landmarks in a frame.
761
+
762
+ Args:
763
+ frame_landmarks: Landmark dictionary for a single frame
764
+
765
+ Returns:
766
+ Average visibility of foot landmarks (0.0 if none visible)
767
+ """
768
+ foot_keys = ["left_ankle", "right_ankle", "left_heel", "right_heel"]
769
+ foot_vis = [frame_landmarks[key][2] for key in foot_keys if key in frame_landmarks]
770
+ return float(np.mean(foot_vis)) if foot_vis else 0.0
771
+
772
+
757
773
  def extract_foot_positions_and_visibilities(
758
774
  smoothed_landmarks: list[dict[str, tuple[float, float, float]] | None],
759
775
  ) -> tuple[np.ndarray, np.ndarray]:
@@ -775,13 +791,7 @@ def extract_foot_positions_and_visibilities(
775
791
  if frame_landmarks:
776
792
  _, foot_y = compute_average_foot_position(frame_landmarks)
777
793
  position_list.append(foot_y)
778
-
779
- # Average visibility of foot landmarks
780
- foot_vis = []
781
- for key in ["left_ankle", "right_ankle", "left_heel", "right_heel"]:
782
- if key in frame_landmarks:
783
- foot_vis.append(frame_landmarks[key][2])
784
- visibilities_list.append(float(np.mean(foot_vis)) if foot_vis else 0.0)
794
+ visibilities_list.append(_calculate_average_visibility(frame_landmarks))
785
795
  else:
786
796
  # Fill missing frames with last known position or default
787
797
  position_list.append(position_list[-1] if position_list else 0.5)
@@ -700,7 +700,7 @@ wheels = [
700
700
 
701
701
  [[package]]
702
702
  name = "kinemotion"
703
- version = "0.22.1"
703
+ version = "0.23.0"
704
704
  source = { editable = "." }
705
705
  dependencies = [
706
706
  { name = "click" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes