kinemotion 0.29.3__py3-none-any.whl → 0.31.0__py3-none-any.whl
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.
- kinemotion/api.py +35 -7
- kinemotion/cmj/analysis.py +6 -3
- kinemotion/cmj/cli.py +11 -6
- kinemotion/cmj/debug_overlay.py +3 -3
- kinemotion/cmj/kinematics.py +22 -7
- kinemotion/core/cli_utils.py +4 -2
- kinemotion/core/cmj_metrics_validator.py +134 -21
- kinemotion/core/cmj_validation_bounds.py +15 -1
- kinemotion/core/dropjump_metrics_validator.py +346 -0
- kinemotion/core/dropjump_validation_bounds.py +196 -0
- kinemotion/core/metadata.py +2 -1
- kinemotion/core/quality.py +5 -4
- kinemotion/core/smoothing.py +4 -2
- kinemotion/core/video_io.py +3 -2
- kinemotion/dropjump/analysis.py +12 -7
- kinemotion/dropjump/cli.py +7 -4
- kinemotion/dropjump/kinematics.py +18 -5
- {kinemotion-0.29.3.dist-info → kinemotion-0.31.0.dist-info}/METADATA +1 -1
- kinemotion-0.31.0.dist-info/RECORD +35 -0
- {kinemotion-0.29.3.dist-info → kinemotion-0.31.0.dist-info}/WHEEL +1 -1
- kinemotion-0.29.3.dist-info/RECORD +0 -33
- {kinemotion-0.29.3.dist-info → kinemotion-0.31.0.dist-info}/entry_points.txt +0 -0
- {kinemotion-0.29.3.dist-info → kinemotion-0.31.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -16,6 +16,7 @@ from .analysis import (
|
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
if TYPE_CHECKING:
|
|
19
|
+
from ..core.dropjump_metrics_validator import ValidationResult
|
|
19
20
|
from ..core.metadata import ResultMetadata
|
|
20
21
|
from ..core.quality import QualityAssessment
|
|
21
22
|
|
|
@@ -39,11 +40,12 @@ class DropJumpDataDict(TypedDict, total=False):
|
|
|
39
40
|
flight_end_frame_precise: float | None
|
|
40
41
|
|
|
41
42
|
|
|
42
|
-
class DropJumpResultDict(TypedDict):
|
|
43
|
+
class DropJumpResultDict(TypedDict, total=False):
|
|
43
44
|
"""Type-safe dictionary for complete drop jump result with data and metadata."""
|
|
44
45
|
|
|
45
46
|
data: DropJumpDataDict
|
|
46
47
|
metadata: dict # ResultMetadata.to_dict()
|
|
48
|
+
validation: dict # ValidationResult.to_dict()
|
|
47
49
|
|
|
48
50
|
|
|
49
51
|
class DropJumpMetrics:
|
|
@@ -69,6 +71,8 @@ class DropJumpMetrics:
|
|
|
69
71
|
self.quality_assessment: QualityAssessment | None = None
|
|
70
72
|
# Complete metadata
|
|
71
73
|
self.result_metadata: ResultMetadata | None = None
|
|
74
|
+
# Validation result
|
|
75
|
+
self.validation_result: ValidationResult | None = None
|
|
72
76
|
|
|
73
77
|
def _build_data_dict(self) -> DropJumpDataDict:
|
|
74
78
|
"""Build the data portion of the result dictionary.
|
|
@@ -125,11 +129,17 @@ class DropJumpMetrics:
|
|
|
125
129
|
Returns:
|
|
126
130
|
Dictionary with nested data and metadata structure.
|
|
127
131
|
"""
|
|
128
|
-
|
|
132
|
+
result: DropJumpResultDict = {
|
|
129
133
|
"data": self._build_data_dict(),
|
|
130
134
|
"metadata": self._build_metadata_dict(),
|
|
131
135
|
}
|
|
132
136
|
|
|
137
|
+
# Include validation results if available
|
|
138
|
+
if self.validation_result is not None:
|
|
139
|
+
result["validation"] = self.validation_result.to_dict()
|
|
140
|
+
|
|
141
|
+
return result
|
|
142
|
+
|
|
133
143
|
|
|
134
144
|
def _determine_drop_start_frame(
|
|
135
145
|
drop_start_frame: int | None,
|
|
@@ -225,7 +235,8 @@ def _identify_main_contact_phase(
|
|
|
225
235
|
]
|
|
226
236
|
|
|
227
237
|
if ground_after_air and first_ground_idx < first_air_idx:
|
|
228
|
-
# Check if first ground is at higher elevation (lower y) than
|
|
238
|
+
# Check if first ground is at higher elevation (lower y) than
|
|
239
|
+
# ground after air
|
|
229
240
|
first_ground_y = float(
|
|
230
241
|
np.mean(foot_y_positions[first_ground_start : first_ground_end + 1])
|
|
231
242
|
)
|
|
@@ -384,8 +395,10 @@ def calculate_drop_jump_metrics(
|
|
|
384
395
|
foot_y_positions: Vertical positions of feet (normalized 0-1)
|
|
385
396
|
fps: Video frame rate
|
|
386
397
|
drop_start_frame: Optional manual drop start frame
|
|
387
|
-
velocity_threshold: Velocity threshold used for contact detection
|
|
388
|
-
|
|
398
|
+
velocity_threshold: Velocity threshold used for contact detection
|
|
399
|
+
(for interpolation)
|
|
400
|
+
smoothing_window: Window size for velocity/acceleration smoothing
|
|
401
|
+
(must be odd)
|
|
389
402
|
polyorder: Polynomial order for Savitzky-Golay filter (default: 2)
|
|
390
403
|
use_curvature: Whether to use curvature analysis for refining transitions
|
|
391
404
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.31.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
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
kinemotion/__init__.py,sha256=sxdDOekOrIgjxm842gy-6zfq7OWmGl9ShJtXCm4JI7c,723
|
|
2
|
+
kinemotion/api.py,sha256=IcvtjK38Eoh5u53yu99NaeChLDNvv7NSnlDcK8fhVS8,39349
|
|
3
|
+
kinemotion/cli.py,sha256=cqYV_7URH0JUDy1VQ_EDLv63FmNO4Ns20m6s1XAjiP4,464
|
|
4
|
+
kinemotion/cmj/__init__.py,sha256=Ynv0-Oco4I3Y1Ubj25m3h9h2XFqeNwpAewXmAYOmwfU,127
|
|
5
|
+
kinemotion/cmj/analysis.py,sha256=88zRNufM88Mc4p_YdnbXoSJM-pWAe4C9I7TqcH7QM9U,19815
|
|
6
|
+
kinemotion/cmj/cli.py,sha256=Mj2h9It1jVjAauvtCxfLWTRijj7zbYhxZuebhw2Zz6w,10828
|
|
7
|
+
kinemotion/cmj/debug_overlay.py,sha256=fXmWoHhqMLGo4vTtB6Ezs3yLUDOLw63zLIgU2gFlJQU,15892
|
|
8
|
+
kinemotion/cmj/joint_angles.py,sha256=HmheIEiKcQz39cRezk4h-htorOhGNPsqKIR9RsAEKts,9960
|
|
9
|
+
kinemotion/cmj/kinematics.py,sha256=qRBe87NkX-7HQTQ8RoF-EpvfcffgP5vycJJRrxpHboc,10307
|
|
10
|
+
kinemotion/core/__init__.py,sha256=HsqolRa60cW3vrG8F9Lvr9WvWcs5hCmsTzSgo7imi-4,1278
|
|
11
|
+
kinemotion/core/auto_tuning.py,sha256=j6cul_qC6k0XyryCG93C1AWH2MKPj3UBMzuX02xaqfI,11235
|
|
12
|
+
kinemotion/core/cli_utils.py,sha256=8xQvTiZFAQULGdpB9g-Mvf0doSgoXi1ZZfVY2T2zWss,7278
|
|
13
|
+
kinemotion/core/cmj_metrics_validator.py,sha256=VVRn56pG3GKna_EDv8jQ5msYNv4VOUR5fTcqpSUzdIA,31334
|
|
14
|
+
kinemotion/core/cmj_validation_bounds.py,sha256=NXW0d4S8hDqSkzAiyX9UyWDnKsWf61ygEKTKE2a1uNc,14069
|
|
15
|
+
kinemotion/core/debug_overlay_utils.py,sha256=TyUb5okv5qw8oeaX3jsUO_kpwf1NnaHEAOTm-8LwTno,4587
|
|
16
|
+
kinemotion/core/dropjump_metrics_validator.py,sha256=zTkWslex9qGQuJSEZltUXYyFLBtisPGGxwqpYpE_Mx4,12040
|
|
17
|
+
kinemotion/core/dropjump_validation_bounds.py,sha256=Ow7T-0IK_qy0k9UZdiCuT_tttxklWAkuXFalQkF8Jbs,6927
|
|
18
|
+
kinemotion/core/filtering.py,sha256=f-m-aA59e4WqE6u-9MA51wssu7rI-Y_7n1cG8IWdeRQ,11241
|
|
19
|
+
kinemotion/core/formatting.py,sha256=G_3eqgOtym9RFOZVEwCxye4A2cyrmgvtQ214vIshowU,2480
|
|
20
|
+
kinemotion/core/metadata.py,sha256=iz9YdkesHo-85TVBCoQVn7zkbrSde_fqjU79s_b-TZk,6829
|
|
21
|
+
kinemotion/core/pose.py,sha256=ztemdZ_ysVVK3gbXabm8qS_dr1VfJX9KZjmcO-Z-iNE,8532
|
|
22
|
+
kinemotion/core/quality.py,sha256=dPGQp08y8DdEUbUdjTThnUOUsALgF0D2sdz50cm6wLI,13098
|
|
23
|
+
kinemotion/core/smoothing.py,sha256=J-GjFP6xW9TO4teOqFd5523zTY2jYIY1Nd99cZvoM3s,14110
|
|
24
|
+
kinemotion/core/video_io.py,sha256=fDdyYVIKqUSgCjBJa8l_S0SrDPDAhrWYfsDBNRuz1oM,7549
|
|
25
|
+
kinemotion/dropjump/__init__.py,sha256=yc1XiZ9vfo5h_n7PKVSiX2TTgaIfGL7Y7SkQtiDZj_E,838
|
|
26
|
+
kinemotion/dropjump/analysis.py,sha256=Sz1lnAsQSp9fzkDy8AuqQtE47LKBqNwiLkaKzz4W_Wk,29099
|
|
27
|
+
kinemotion/dropjump/cli.py,sha256=n_Wfv3AC6YIgRPYhO3F2nTSai0NR7fh95nAoWjryQeY,16250
|
|
28
|
+
kinemotion/dropjump/debug_overlay.py,sha256=LkPw6ucb7beoYWS4L-Lvjs1KLCm5wAWDAfiznUeV2IQ,5668
|
|
29
|
+
kinemotion/dropjump/kinematics.py,sha256=IH6nCOwTuocQNX1VPS_am9vPpMRUUla0a0MjDhEiXnA,17129
|
|
30
|
+
kinemotion/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
+
kinemotion-0.31.0.dist-info/METADATA,sha256=5CCFGGgAPs4qHj2NoDB3ZHKjhQ7iNHcGx-Xcqfl8N1s,26020
|
|
32
|
+
kinemotion-0.31.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
33
|
+
kinemotion-0.31.0.dist-info/entry_points.txt,sha256=zaqnAnjLvcdrk1Qvj5nvXZCZ2gp0prS7it1zTJygcIY,50
|
|
34
|
+
kinemotion-0.31.0.dist-info/licenses/LICENSE,sha256=KZajvqsHw0NoOHOi2q0FZ4NBe9HdV6oey-IPYAtHXfg,1088
|
|
35
|
+
kinemotion-0.31.0.dist-info/RECORD,,
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
kinemotion/__init__.py,sha256=sxdDOekOrIgjxm842gy-6zfq7OWmGl9ShJtXCm4JI7c,723
|
|
2
|
-
kinemotion/api.py,sha256=tbkjXsfe0N0Bmik6XRIOYM7Nom4QqeQJSpDx7IoiuSA,38177
|
|
3
|
-
kinemotion/cli.py,sha256=cqYV_7URH0JUDy1VQ_EDLv63FmNO4Ns20m6s1XAjiP4,464
|
|
4
|
-
kinemotion/cmj/__init__.py,sha256=Ynv0-Oco4I3Y1Ubj25m3h9h2XFqeNwpAewXmAYOmwfU,127
|
|
5
|
-
kinemotion/cmj/analysis.py,sha256=il7-sfM89ZetxLhmw9boViaP4E8Y3mlS_XI-B5txmMs,19795
|
|
6
|
-
kinemotion/cmj/cli.py,sha256=12FEfWrseG4kCUbgHHdBPkWp6zzVQ0VAzfgNJotArmM,10792
|
|
7
|
-
kinemotion/cmj/debug_overlay.py,sha256=D-y2FQKI01KY0WXFKTKg6p9Qj3AkXCE7xjau3Ais080,15886
|
|
8
|
-
kinemotion/cmj/joint_angles.py,sha256=HmheIEiKcQz39cRezk4h-htorOhGNPsqKIR9RsAEKts,9960
|
|
9
|
-
kinemotion/cmj/kinematics.py,sha256=-iBFg2AkQR4LaThCQzO09fx6qJed27ZfMDQJgE7Si4k,9772
|
|
10
|
-
kinemotion/core/__init__.py,sha256=HsqolRa60cW3vrG8F9Lvr9WvWcs5hCmsTzSgo7imi-4,1278
|
|
11
|
-
kinemotion/core/auto_tuning.py,sha256=j6cul_qC6k0XyryCG93C1AWH2MKPj3UBMzuX02xaqfI,11235
|
|
12
|
-
kinemotion/core/cli_utils.py,sha256=Pq1JF7yvK1YbH0tOUWKjplthCbWsJQt4Lv7esPYH4FM,7254
|
|
13
|
-
kinemotion/core/cmj_metrics_validator.py,sha256=Jfh8oxhxz5BCBIPdeMRHa60tZsliDkN10RiLQYkmck4,27262
|
|
14
|
-
kinemotion/core/cmj_validation_bounds.py,sha256=WBMuJx6ewb-rYan3xmQu32m7bs9h8J5isa4LduZuZkI,13507
|
|
15
|
-
kinemotion/core/debug_overlay_utils.py,sha256=TyUb5okv5qw8oeaX3jsUO_kpwf1NnaHEAOTm-8LwTno,4587
|
|
16
|
-
kinemotion/core/filtering.py,sha256=f-m-aA59e4WqE6u-9MA51wssu7rI-Y_7n1cG8IWdeRQ,11241
|
|
17
|
-
kinemotion/core/formatting.py,sha256=G_3eqgOtym9RFOZVEwCxye4A2cyrmgvtQ214vIshowU,2480
|
|
18
|
-
kinemotion/core/metadata.py,sha256=PyGHL6sx7Hj21lyorg2VsWP9BGTj_y_-wWU6eKCEfJo,6817
|
|
19
|
-
kinemotion/core/pose.py,sha256=ztemdZ_ysVVK3gbXabm8qS_dr1VfJX9KZjmcO-Z-iNE,8532
|
|
20
|
-
kinemotion/core/quality.py,sha256=OC9nuf5IrQ9xURf3eA50VoNWOqkGwbjJpS90q2FDQzA,13082
|
|
21
|
-
kinemotion/core/smoothing.py,sha256=x4o3BnG6k8OaV3emgpoJDF84CE9k5RYR7BeSYH_-8Es,14092
|
|
22
|
-
kinemotion/core/video_io.py,sha256=SQBJSgAV8uOkAh96gNZRjd6XJG1G9dZzDc8kAZ_twy0,7538
|
|
23
|
-
kinemotion/dropjump/__init__.py,sha256=yc1XiZ9vfo5h_n7PKVSiX2TTgaIfGL7Y7SkQtiDZj_E,838
|
|
24
|
-
kinemotion/dropjump/analysis.py,sha256=BQ5NqSPNJjFQOb-W4bXSLvjCgWd-nvqx5NElyeqZJC4,29067
|
|
25
|
-
kinemotion/dropjump/cli.py,sha256=ZyroaYPwz8TgfL39Wcaj6m68Awl6lYXC75ttaflU-c0,16236
|
|
26
|
-
kinemotion/dropjump/debug_overlay.py,sha256=LkPw6ucb7beoYWS4L-Lvjs1KLCm5wAWDAfiznUeV2IQ,5668
|
|
27
|
-
kinemotion/dropjump/kinematics.py,sha256=Yr3G7AQwtYy1dxyeOAYfqqgd4pzoZwWQAhZzxI5RbnE,16658
|
|
28
|
-
kinemotion/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
-
kinemotion-0.29.3.dist-info/METADATA,sha256=g8rKkVRZFe-azMglT9_Po-OAfIr-Dpga28N68QdoF14,26020
|
|
30
|
-
kinemotion-0.29.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
31
|
-
kinemotion-0.29.3.dist-info/entry_points.txt,sha256=zaqnAnjLvcdrk1Qvj5nvXZCZ2gp0prS7it1zTJygcIY,50
|
|
32
|
-
kinemotion-0.29.3.dist-info/licenses/LICENSE,sha256=KZajvqsHw0NoOHOi2q0FZ4NBe9HdV6oey-IPYAtHXfg,1088
|
|
33
|
-
kinemotion-0.29.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|