Compare commits

...

3 Commits

Author SHA1 Message Date
b84c43a898 v2 working 2025-12-08 20:25:20 +01:00
4943a20c11 working 2025-11-28 15:36:57 +00:00
40dc5b3b59 working 2025-11-28 08:31:35 +00:00
28 changed files with 1046 additions and 69 deletions

1
.gitignore vendored
View File

@ -4,5 +4,6 @@
/.gpu-3d/ /.gpu-3d/
/.venv/ /.venv/
/venv/ /venv/
*.mp4
yolo11* yolo11*

3
.idea/JustTwerk.iml generated
View File

@ -6,8 +6,9 @@
<excludeFolder url="file://$MODULE_DIR$/.gpu-3d" /> <excludeFolder url="file://$MODULE_DIR$/.gpu-3d" />
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
<excludeFolder url="file://$MODULE_DIR$/.venv-2" /> <excludeFolder url="file://$MODULE_DIR$/.venv-2" />
<excludeFolder url="file://$MODULE_DIR$/.venv3.10" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.14 virtualenv at C:\Users\Kajetan\PycharmProjects\JustTwerk\.venv-2" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.10 (JustTwerk)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="PyDocumentationSettings"> <component name="PyDocumentationSettings">

2
.idea/misc.xml generated
View File

@ -3,5 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.13 (JustTwerk)" /> <option name="sdkName" value="Python 3.13 (JustTwerk)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.14 virtualenv at C:\Users\Kajetan\PycharmProjects\JustTwerk\.venv-2" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (JustTwerk)" project-jdk-type="Python SDK" />
</project> </project>

109
.idea/workspace.xml generated
View File

@ -5,13 +5,30 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="441a4e7b-d6ce-44cb-92c5-2f22f1b1874f" name="Changes" comment="working"> <list default="true" id="441a4e7b-d6ce-44cb-92c5-2f22f1b1874f" name="Changes" comment="working">
<change afterPath="$PROJECT_DIR$/moves_dump.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/3cams_3D_v2.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/3cams_3d.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/3ddisplay_replay.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/3ddisplay_replay_smoothed.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/audio.wav" afterDir="false" />
<change afterPath="$PROJECT_DIR$/calib_relative_to_A_3cams.npz" afterDir="false" />
<change afterPath="$PROJECT_DIR$/calibration_3cams.npz" afterDir="false" />
<change afterPath="$PROJECT_DIR$/calibration_3cams_2.npz" afterDir="false" />
<change afterPath="$PROJECT_DIR$/checkpoint/pretrained_h36m_detectron_coco.bin" afterDir="false" />
<change afterPath="$PROJECT_DIR$/moves_dump_2.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/moves_videopose3d.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/poses.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/record.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/record_one_pose.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/record_video_pose.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/rotate.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/JustTwerk.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/JustTwerk.iml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/JustTwerk.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/JustTwerk.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/calculate.py" beforeDir="false" afterPath="$PROJECT_DIR$/calculate.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/utils.py" beforeDir="false" afterPath="$PROJECT_DIR$/utils.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/moves.pkl" beforeDir="false" afterPath="$PROJECT_DIR$/moves.pkl" afterDir="false" />
<change beforePath="$PROJECT_DIR$/video_methods.py" beforeDir="false" afterPath="$PROJECT_DIR$/video_methods.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/moves_3d_mp4.py" beforeDir="false" afterPath="$PROJECT_DIR$/moves_3d_mp4.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/moves_dump.py" beforeDir="false" afterPath="$PROJECT_DIR$/moves_dump.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -41,7 +58,11 @@
"keyToString": { "keyToString": {
"ModuleVcsDetector.initialDetectionPerformed": "true", "ModuleVcsDetector.initialDetectionPerformed": "true",
"Python.02_whole_body_from_image.executor": "Run", "Python.02_whole_body_from_image.executor": "Run",
"Python.3cams_3D_v2.executor": "Run",
"Python.3cams_3d.executor": "Run",
"Python.3d.executor": "Run", "Python.3d.executor": "Run",
"Python.3ddisplay_replay.executor": "Run",
"Python.3ddisplay_replay_smoothed.executor": "Run",
"Python.body3d.executor": "Run", "Python.body3d.executor": "Run",
"Python.body3d_pose_lifter_demo.executor": "Run", "Python.body3d_pose_lifter_demo.executor": "Run",
"Python.calculate.executor": "Run", "Python.calculate.executor": "Run",
@ -50,11 +71,18 @@
"Python.filter.executor": "Run", "Python.filter.executor": "Run",
"Python.is_torch.executor": "Run", "Python.is_torch.executor": "Run",
"Python.local_visualizer_3d.executor": "Run", "Python.local_visualizer_3d.executor": "Run",
"Python.mac.executor": "Run",
"Python.main.executor": "Run", "Python.main.executor": "Run",
"Python.moves_3d_mp4.executor": "Run",
"Python.moves_dump.executor": "Run", "Python.moves_dump.executor": "Run",
"Python.moves_videopose3d.executor": "Run",
"Python.openpose.executor": "Run", "Python.openpose.executor": "Run",
"Python.receive_images.executor": "Run", "Python.receive_images.executor": "Run",
"Python.receiver.executor": "Run", "Python.receiver.executor": "Run",
"Python.record.executor": "Run",
"Python.record_one_pose.executor": "Run",
"Python.record_video_pose.executor": "Run",
"Python.rotate.executor": "Run",
"Python.sender.executor": "Run", "Python.sender.executor": "Run",
"Python.test.executor": "Run", "Python.test.executor": "Run",
"Python.ultralytics-test.executor": "Run", "Python.ultralytics-test.executor": "Run",
@ -69,13 +97,17 @@
"node.js.selected.package.eslint": "(autodetect)", "node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)", "node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm", "nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "configurable.group.editor", "settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true" "vue.rearranger.settings.migration": "true"
} }
}]]></component> }]]></component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\Kajetan\PycharmProjects\JustTwerk" /> <recent name="C:\Users\Kajetan\PycharmProjects\JustTwerk" />
<recent name="C:\Users\Kajetan\PycharmProjects\JustTwerk\checkpoints" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\Kajetan\PycharmProjects\JustTwerk\video" />
</key> </key>
</component> </component>
<component name="RunManager" selected="Python.main"> <component name="RunManager" selected="Python.main">
@ -125,6 +157,30 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="record" type="PythonConfigurationType" factoryName="Python">
<module name="JustTwerk" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="SDK_NAME" value="Python 3.10 (JustTwerk)" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="record.py" />
<option name="PARAMETERS" value="cam" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="JustTwerk" /> <module name="JustTwerk" />
<option name="ENV_FILES" value="" /> <option name="ENV_FILES" value="" />
@ -148,6 +204,12 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<list>
<item itemvalue="Python.record" />
<item itemvalue="Python.draw" />
<item itemvalue="Python.main" />
<item itemvalue="Python.test" />
</list>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Python.main" /> <item itemvalue="Python.main" />
@ -184,6 +246,20 @@
<workItem from="1757522631129" duration="3558000" /> <workItem from="1757522631129" duration="3558000" />
<workItem from="1764254526843" duration="634000" /> <workItem from="1764254526843" duration="634000" />
<workItem from="1764255184384" duration="6392000" /> <workItem from="1764255184384" duration="6392000" />
<workItem from="1764353820246" duration="17882000" />
<workItem from="1764784804916" duration="7972000" />
<workItem from="1764880290552" duration="2878000" />
<workItem from="1764958893210" duration="34000" />
<workItem from="1765018411287" duration="71000" />
<workItem from="1765018505033" duration="53000" />
<workItem from="1765020107173" duration="1348000" />
<workItem from="1765025143997" duration="529000" />
<workItem from="1765027747129" duration="34000" />
<workItem from="1765030737128" duration="335000" />
<workItem from="1765111063348" duration="626000" />
<workItem from="1765127499247" duration="1482000" />
<workItem from="1765146209178" duration="2453000" />
<workItem from="1765209069862" duration="6395000" />
</task> </task>
<task id="LOCAL-00001" summary="initial commit"> <task id="LOCAL-00001" summary="initial commit">
<option name="closed" value="true" /> <option name="closed" value="true" />
@ -237,23 +313,34 @@
<option name="LAST_COMMIT_MESSAGE" value="working" /> <option name="LAST_COMMIT_MESSAGE" value="working" />
</component> </component>
<component name="com.intellij.coverage.CoverageDataManagerImpl"> <component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/JustTwerk$main.coverage" NAME="main Coverage Results" MODIFIED="1764275198914" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$receiver.coverage" NAME="receiver Coverage Results" MODIFIED="1756142451233" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$filter.coverage" NAME="filter Coverage Results" MODIFIED="1755972211046" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$body3d_pose_lifter_demo.coverage" NAME="body3d_pose_lifter_demo Coverage Results" MODIFIED="1755937235510" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mmpose/demo" /> <SUITE FILE_PATH="coverage/JustTwerk$body3d_pose_lifter_demo.coverage" NAME="body3d_pose_lifter_demo Coverage Results" MODIFIED="1755937235510" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/mmpose/demo" />
<SUITE FILE_PATH="coverage/JustTwerk$body3d.coverage" NAME="body3d Coverage Results" MODIFIED="1755944498141" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$02_whole_body_from_image.coverage" NAME="02_whole_body_from_image Coverage Results" MODIFIED="1755885569302" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$checkpoint.coverage" NAME="checkpoint Coverage Results" MODIFIED="1755936916130" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/.gpu/Lib/site-packages/mmengine/runner" /> <SUITE FILE_PATH="coverage/JustTwerk$checkpoint.coverage" NAME="checkpoint Coverage Results" MODIFIED="1755936916130" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/.gpu/Lib/site-packages/mmengine/runner" />
<SUITE FILE_PATH="coverage/JustTwerk$calculate.coverage" NAME="calculate Coverage Results" MODIFIED="1756054778057" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$calculate.coverage" NAME="calculate Coverage Results" MODIFIED="1756054778057" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$receive_images.coverage" NAME="receive_images Coverage Results" MODIFIED="1755966230858" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$moves_videopose3d.coverage" NAME="moves_videopose3d Coverage Results" MODIFIED="1764346738082" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$record_one_pose.coverage" NAME="record_one_pose Coverage Results" MODIFIED="1764350684205" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$3ddisplay_replay.coverage" NAME="3ddisplay_replay Coverage Results" MODIFIED="1765127528144" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$sender.coverage" NAME="sender Coverage Results" MODIFIED="1756142463914" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$sender.coverage" NAME="sender Coverage Results" MODIFIED="1756142463914" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$openpose.coverage" NAME="openpose Coverage Results" MODIFIED="1755886110615" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/human-pose-estimation-opencv" /> <SUITE FILE_PATH="coverage/JustTwerk$openpose.coverage" NAME="openpose Coverage Results" MODIFIED="1755886110615" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/human-pose-estimation-opencv" />
<SUITE FILE_PATH="coverage/JustTwerk$draw.coverage" NAME="draw Coverage Results" MODIFIED="1756053706980" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$draw.coverage" NAME="draw Coverage Results" MODIFIED="1756053706980" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$ultralytics_test.coverage" NAME="ultralytics-test Coverage Results" MODIFIED="1756116377896" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$ultralytics_test.coverage" NAME="ultralytics-test Coverage Results" MODIFIED="1756116377896" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$3d.coverage" NAME="3d Coverage Results" MODIFIED="1756027604884" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$3d.coverage" NAME="3d Coverage Results" MODIFIED="1756027604884" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$moves_dump.coverage" NAME="moves_dump Coverage Results" MODIFIED="1764275034611" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$moves_dump.coverage" NAME="moves_dump Coverage Results" MODIFIED="1765111609135" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$local_visualizer_3d.coverage" NAME="local_visualizer_3d Coverage Results" MODIFIED="1755937454029" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/.gpu/Lib/site-packages/mmpose/visualization" /> <SUITE FILE_PATH="coverage/JustTwerk$local_visualizer_3d.coverage" NAME="local_visualizer_3d Coverage Results" MODIFIED="1755937454029" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/.gpu/Lib/site-packages/mmpose/visualization" />
<SUITE FILE_PATH="coverage/JustTwerk$3cams_3d.coverage" NAME="3cams_3d Coverage Results" MODIFIED="1765111273047" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$main.coverage" NAME="main Coverage Results" MODIFIED="1765220020573" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$receiver.coverage" NAME="receiver Coverage Results" MODIFIED="1756142451233" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$filter.coverage" NAME="filter Coverage Results" MODIFIED="1755972211046" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$record.coverage" NAME="record Coverage Results" MODIFIED="1764350881825" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="" />
<SUITE FILE_PATH="coverage/JustTwerk$moves_3d_mp4.coverage" NAME="moves_3d_mp4 Coverage Results" MODIFIED="1764352975374" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$body3d.coverage" NAME="body3d Coverage Results" MODIFIED="1755944498141" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$02_whole_body_from_image.coverage" NAME="02_whole_body_from_image Coverage Results" MODIFIED="1755885569302" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$3ddisplay_replay_smoothed.coverage" NAME="3ddisplay_replay_smoothed Coverage Results" MODIFIED="1764878813417" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$record_video_pose.coverage" NAME="record_video_pose Coverage Results" MODIFIED="1765215859591" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$receive_images.coverage" NAME="receive_images Coverage Results" MODIFIED="1755966230858" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$is_torch.coverage" NAME="is_torch Coverage Results" MODIFIED="1764256054151" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$is_torch.coverage" NAME="is_torch Coverage Results" MODIFIED="1764256054151" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$rotate.coverage" NAME="rotate Coverage Results" MODIFIED="1764831290832" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$mac.coverage" NAME="mac Coverage Results" MODIFIED="1764919104935" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$3cams_3D_v2.coverage" NAME="3cams_3D_v2 Coverage Results" MODIFIED="1765111338220" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/JustTwerk$test.coverage" NAME="test Coverage Results" MODIFIED="1756025632346" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/JustTwerk$test.coverage" NAME="test Coverage Results" MODIFIED="1756025632346" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component> </component>
</project> </project>

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}

85
3cams_3D_v2.py Normal file
View File

@ -0,0 +1,85 @@
import glob
import numpy as np
import cv2
import tqdm
from ultralytics import YOLO
import matplotlib.pyplot as plt
# --- Wczytanie kalibracji ---
data = np.load("calib_relative_to_A_3cams.npz")
K_A, D_A = data["K_A"], data["D_A"]
K_B, D_B = data["K_B"], data["D_B"]
K_C, D_C = data["K_C"], data["D_C"]
R_AA, T_AA = data["R_AA"], data["T_AA"]
R_BA, T_BA = data["R_BA"], data["T_BA"]
R_CA, T_CA = data["R_CA"], data["T_CA"]
# reshape translacji
T_AA = T_AA.reshape(3,1)
T_BA = T_BA.reshape(3,1)
T_CA = T_CA.reshape(3,1)
# Kamera A = układ odniesienia
P_A = K_A @ np.hstack((np.eye(3), np.zeros((3,1))))
P_B = K_B @ np.hstack((R_BA, T_BA))
P_C = K_C @ np.hstack((R_CA, T_CA))
def triangulate_three_views(pA, pB, pC):
pA = pA.reshape(2,1)
pB = pB.reshape(2,1)
pC = pC.reshape(2,1)
XAB_h = cv2.triangulatePoints(P_A, P_B, pA, pB)
XAB = (XAB_h / XAB_h[3])[:3].reshape(3)
XAC_h = cv2.triangulatePoints(P_A, P_C, pA, pC)
XAC = (XAC_h / XAC_h[3])[:3].reshape(3)
return (XAB + XAC)/2
# --- YOLO Pose ---
model = YOLO("yolo11x-pose.pt")
skeleton = [
[0,1],[0,2],[1,3],[2,4],[0,5],[0,6],
[5,7],[7,9],[6,8],[8,10],[5,6],
[11,12],[12,14],[14,16],[11,13],[13,15]
]
points3DList = {}
frames = sorted(glob.glob("video/camA/*.jpg"), key=lambda f: int(__import__("re").search(r"\d+", f).group()))
for frame in tqdm.tqdm(frames):
name = frame.replace('video/camA\\',"")
imgA = cv2.imread(f"video/camA/{name}")
imgB = cv2.imread(f"video/camB/{name}")
imgC = cv2.imread(f"video/camC/{name}")
rA = model(imgA, verbose=False)[0]
rB = model(imgB, verbose=False)[0]
rC = model(imgC, verbose=False)[0]
if len(rA.keypoints.xy)==0: continue
if len(rB.keypoints.xy)==0: continue
if len(rC.keypoints.xy)==0: continue
kpA = rA.keypoints.xy[0].cpu().numpy()
kpB = rB.keypoints.xy[0].cpu().numpy()
kpC = rC.keypoints.xy[0].cpu().numpy()
pts = []
for i in range(kpA.shape[0]):
X = triangulate_three_views(kpA[i], kpB[i], kpC[i])
pts.append(X)
pts = np.array(pts)
points3DList[name] = pts
import pickle
with open("replay_tpose.pkl", "wb") as f:
pickle.dump(points3DList, f)

112
3cams_3d.py Normal file
View File

@ -0,0 +1,112 @@
import glob
import numpy as np
import cv2
from ultralytics import YOLO
import matplotlib.pyplot as plt
# --- Wczytanie kalibracji ---
data = np.load("calibration_3cams_1.npz")
K1, D1 = data["K1"], data["D1"]
K2, D2 = data["K2"], data["D2"]
K3, D3 = data["K3"], data["D3"]
R12, T12 = data["R12"], data["T12"]
R13, T13 = data["R13"], data["T13"]
# Naprawa wymiarów translacji
T12 = T12.reshape(3,1)
T13 = T13.reshape(3,1)
# Kamera 1 = układ odniesienia
P1 = K1 @ np.hstack((np.eye(3), np.zeros((3,1))))
P2 = K2 @ np.hstack((R12, T12))
P3 = K3 @ np.hstack((R13, T13))
# --- Funkcja triangulacji 3D z trzech kamer ---
def triangulate_three_views(p1, p2, p3):
"""
Triangulacja 3D z trzech kamer metodą OpenCV + średnia dla stabilności
p1, p2, p3: punkty w pikselach (2,)
"""
# Zamiana na odpowiedni kształt (2,1)
p1 = p1.reshape(2,1)
p2 = p2.reshape(2,1)
p3 = p3.reshape(2,1)
# Triangulacja pary kamer 1-2
X12_h = cv2.triangulatePoints(P1, P2, p1, p2)
X12 = (X12_h / X12_h[3])[:3].reshape(3)
# Triangulacja pary kamer 1-3
X13_h = cv2.triangulatePoints(P1, P3, p1, p3)
X13 = (X13_h / X13_h[3])[:3].reshape(3)
# Średnia dla większej stabilności
X_avg = (X12 + X13) / 2
return X_avg
# --- Wczytanie YOLOv11 Pose ---
model = YOLO("yolo11x-pose.pt")
skeleton = [
[0,1],[0,2],[1,3],[2,4],[0,5],[0,6],
[5,7],[7,9],[6,8],[8,10],[5,6],
[11,12],[12,14],[14,16],[11,13],[13,15]
]
plt.ion() # włączenie trybu interaktywnego
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Tworzymy początkowy wykres punktów
points_plot = ax.scatter([], [], [], c='r', marker='o', s=50)
lines_plot = [ax.plot([0,0],[0,0],[0,0], c='b')[0] for _ in skeleton]
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.view_init(elev=20, azim=-60)
points3DList = {}
for i in sorted(glob.glob("video/camA/*.jpg"), key=lambda f: int(__import__("re").search(r"\d+", f).group())):
# Zakładamy, że mamy 3 obrazy z 3 kamer
data = i.replace(f'video/camA\\', "")
img1 = cv2.imread(f"video/camA/{data}")
img2 = cv2.imread(f"video/camB/{data}")
img3 = cv2.imread(f"video/camC/{data}")
# Predykcja keypoints
results1 = model(img1, verbose=False)[0]
results2 = model(img2, verbose=False)[0]
results3 = model(img3, verbose=False)[0]
# Zakładamy jedną osobę na scenie
if len(results1.keypoints.xy) == 0: continue
if len(results2.keypoints.xy) == 0: continue
if len(results3.keypoints.xy) == 0: continue
yolo_cam1 = results1.keypoints.xy[0].cpu().numpy() # shape (17,2)
yolo_cam2 = results2.keypoints.xy[0].cpu().numpy()
yolo_cam3 = results3.keypoints.xy[0].cpu().numpy()
# --- Triangulacja wszystkich punktów ---
points3D = []
for i in range(yolo_cam1.shape[0]): # 17 punktów COCO
p1 = yolo_cam1[i]
p2 = yolo_cam2[i]
p3 = yolo_cam3[i]
X = triangulate_three_views(p1, p2, p3)
points3D.append(X)
points3D = np.array(points3D)
print(points3D)
points3DList[data] = points3D
import pickle
with open("replay_tpose.pkl", "wb") as f:
pickle.dump(points3DList, f)

57
3ddisplay_replay.py Normal file
View File

@ -0,0 +1,57 @@
import pickle
from matplotlib import pyplot as plt
with open("replay_xyz.pkl", "rb") as f:
points3DList = pickle.load(f)
skeleton = [
[0, 1], [0, 2], # nose -> eyes
[1, 3], [2, 4], # eyes -> ears
# [0, 5], [0, 6], # nose -> shoulders
[5, 7], [7, 9], # left arm
[6, 8], [8, 10], # right arm
[5, 6], # shoulders
[5, 11], [6, 12], # shoulders -> hips
[11, 12], # hips
[11, 13], [13, 15], # left leg
[12, 14], [14, 16] # right leg
]
plt.ion() # włączenie trybu interaktywnego
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Tworzymy początkowy wykres punktów
points_plot = ax.scatter([], [], [], c='r', marker='o', s=50)
lines_plot = [ax.plot([0,0],[0,0],[0,0], c='b')[0] for _ in skeleton]
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_xlim(-0.6, 0.4)
ax.set_ylim(1.2, 2.2)
ax.set_zlim(-0.5, 1.1)
ax.view_init(elev=20, azim=-60)
i = 0
for points3Dkey in points3DList:
points3D = points3DList[points3Dkey]
print("3D points:\n", points3D)
# --- Wizualizacja 3D ---d
X = points3D[:,0] - 0.25
Z = -points3D[:,1] + 0.5
Y = points3D[:,2]
points_plot._offsets3d = (X, Y, Z)
# Aktualizacja linii (szkielet)
for idx, (i, j) in enumerate(skeleton):
lines_plot[idx].set_data([X[i], X[j]], [Y[i], Y[j]])
lines_plot[idx].set_3d_properties([Z[i], Z[j]])
fig.canvas.draw()
fig.canvas.flush_events()
plt.pause(0.01)

View File

@ -0,0 +1,58 @@
from scipy.signal import savgol_filter
import numpy as np
import pickle
from matplotlib import pyplot as plt
with open("replay_xyz.pkl", "rb") as f:
points3DList = pickle.load(f)
skeleton = [
[0, 1], [0, 2],
[1, 3], [2, 4],
[5, 7], [7, 9],
[6, 8], [8, 10],
[5, 6],
[5, 11], [6, 12],
[11, 12],
[11, 13], [13, 15],
[12, 14], [14, 16]
]
keys_sorted = sorted(points3DList.keys())
points_sequence = np.array([points3DList[k] for k in keys_sorted]) # (frames, points, 3)
# --- Filtr Savitzky-Golaya ---
window_length = 7 # musi być nieparzyste
polyorder = 2
smoothed_sequence = savgol_filter(points_sequence, window_length=window_length,
polyorder=polyorder, axis=0, mode='nearest')
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
points_plot = ax.scatter([], [], [], c='r', marker='o', s=50)
lines_plot = [ax.plot([0,0],[0,0],[0,0], c='b')[0] for _ in skeleton]
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_xlim(-0.6, 0.4)
ax.set_ylim(1.2, 2.2)
ax.set_zlim(-0.5, 1.1)
ax.view_init(elev=20, azim=-60)
for frame_points in smoothed_sequence:
X = frame_points[:,0] - 0.25
Z = -frame_points[:,1] + 0.5
Y = frame_points[:,2]
points_plot._offsets3d = (X, Y, Z)
for idx, (i, j) in enumerate(skeleton):
lines_plot[idx].set_data([X[i], X[j]], [Y[i], Y[j]])
lines_plot[idx].set_3d_properties([Z[i], Z[j]])
fig.canvas.draw()
fig.canvas.flush_events()
plt.pause(0.001)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -52,7 +52,7 @@ def compare_poses(f1, f2):
def compare_poses_boolean(f1, f2): def compare_poses_boolean(f1, f2):
l2, cos_sim = compare_poses(f1, f2) l2, cos_sim = compare_poses(f1, f2)
return l2 < 0.7 and cos_sim > 0.90 return l2 < 1.2 and cos_sim > 0.85
def center(keypoints): def center(keypoints):
mid_hip = (keypoints[11] + keypoints[12]) / 2 # left_hip=11, right_hip=12 mid_hip = (keypoints[11] + keypoints[12]) / 2 # left_hip=11, right_hip=12

Binary file not shown.

36
mac.py Normal file
View File

@ -0,0 +1,36 @@
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
cap = cv2.VideoCapture(0)
with mp_pose.Pose(
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as pose:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
# To improve performance, optionally mark the image as not writeable to
# pass by reference.
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = pose.process(image)
# Draw the pose annotation on the image.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
# Flip the image horizontally for a selfie-view display.
cv2.imshow('MediaPipe Pose', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()

144
main.py
View File

@ -1,17 +1,23 @@
import json
import os
import pickle import pickle
import socket
import sys import sys
import torch
from ultralytics import YOLO from ultralytics import YOLO
import cv2 import cv2
import time import time
import poses
import utils import utils
from calculate import normalize_pose, compare_poses_boolean from calculate import normalize_pose, compare_poses_boolean
from draw import draw_new from draw import draw_new
from utils import find_closest from utils import find_closest
from video_methods import initialize_method from video_methods import initialize_method
model = YOLO("yolo11x-pose.pt") model = YOLO("yolo11s-pose.pt")
model.to(torch.device('cuda:0'))
if len(sys.argv) == 2: if len(sys.argv) == 2:
method_type = sys.argv[1] method_type = sys.argv[1]
@ -40,36 +46,83 @@ def main():
mehCount = 0 mehCount = 0
goodCount = 0 goodCount = 0
failCount = 0 failCount = 0
failRate = 2 failRate = 10
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("0.0.0.0", 13425))
server_socket.listen()
print("czekam na clienta...")
client_socket, _ = server_socket.accept()
print("mam clienta!")
data = client_socket.recv(1024).decode()
if not data.startswith("id_"):
client_socket.close()
server_socket.close()
return
map = data.replace("id_", "").replace("\n", "").strip()
if not os.path.isfile(f'moves_{map}.pkl'):
print(map)
print("moves_" + map + ".pkl")
client_socket.sendall("not_exists".encode())
client_socket.close()
server_socket.close()
return
moves = [] moves = []
with open('moves.pkl', 'rb') as f: # 'rb' = read binary with open(f'moves_{map}.pkl', 'rb') as f: # 'rb' = read binary
moves = pickle.load(f) moves = pickle.load(f)
startValue = moves[0][0] startValue = moves[0][0]
totalCount = len(moves) totalCount = len(moves)
for i, move in enumerate(moves): for i, move in enumerate(moves):
moves[i] = (move[0] - startValue, move[1], move[2]) moves[i] = ((move[0] - startValue) / 1000, move[1], move[2])
print(moves) currIndex = 1
currTimeIndex = time.time()
deltaTime = time.time()
currStatus = f"Zaczoles tanczyc {currIndex}"
currMove = moves[0]
doStreak = False
streak = 0
doing = 0
actuallyDoing = False
while True: while True:
doing += 1
frame = method.receive_frame() frame = method.receive_frame()
frame = cv2.flip(frame, 1) frame = cv2.flip(frame, 1)
results = model(frame, verbose=False) results = model(frame, verbose=False)
if not actuallyDoing:
client_socket.sendall("start".encode())
actuallyDoing = True
current_time = time.time() current_time = time.time()
delta = current_time - last_time delta = current_time - last_time
last_time = current_time last_time = current_time
if doing % 30 == 0:
if doStreak:
streak += 5
client_socket.sendall(f"streak_{streak}".encode())
else:
streak = 0
client_socket.sendall(f"streak_0".encode())
fps = 1 / delta if delta > 0 else float('inf') fps = 1 / delta if delta > 0 else float('inf')
# print(f"\rDelta: {delta:.4f}s, FPS: {fps:.2f}", end="") # print(f"\rDelta: {delta:.4f}s, FPS: {fps:.2f}", end="")
for result in results: if len(results) != 0:
result = results[0]
kpts = result.keypoints.data[0] if len(result.keypoints.data) else None kpts = result.keypoints.data[0] if len(result.keypoints.data) else None
if kpts is None: if kpts is None:
@ -83,77 +136,84 @@ def main():
cv2.imshow('you', draw_new(draw * 100 + 100)) cv2.imshow('you', draw_new(draw * 100 + 100))
if currTimeIndex != 0 and moves.index(find_closest(moves, time.time() - currTimeIndex)) == len(moves) - 1: if currTimeIndex != 0 and moves.index(find_closest(moves, time.time() - currTimeIndex)) == len(moves) - 1:
mehCount = totalCount - failCount - goodCount mehCount = abs(totalCount - (failCount + goodCount))
stats = {
"failCount": failCount,
"goodCount": goodCount,
"mehCount": mehCount,
"percentage": (goodCount + (0.85 * mehCount)) / totalCount * 100
}
client_socket.sendall(f"finish_{json.dumps(stats)}".encode())
print( print(
f"PODSUMOWANIE: FAIL {failCount} MEH: {mehCount} PERFECT: {goodCount} PERCENTAGE: {(goodCount + (0.95 * mehCount)) / totalCount * 100}%") f"PODSUMOWANIE: FAIL {failCount} MEH: {mehCount} PERFECT: {goodCount} PERCENTAGE: {(goodCount + (0.85 * mehCount)) / totalCount * 100}%")
exit(1) cv2.destroyAllWindows()
break
if currMove is None:
if compare_poses_boolean(moves[0][1], normalized):
currIndex = 1
currTimeIndex = time.time()
deltaTime = time.time()
currStatus = f"Zaczoles tanczyc {currIndex}"
currMove = moves[0]
# thread = Thread(target=print_animation, args=(moves, False)) # thread = Thread(target=print_animation, args=(moves, False))
# thread.start() # thread.start()
else: else:
changed = False changed = False
closest = find_closest(moves, time.time() - currTimeIndex) closest = find_closest(moves, time.time() - currTimeIndex)
cv2.imshow('Dots', draw_new(closest[2])) cv2.imshow('Dots', draw_new(utils.normalize(closest[2]) * 250 + 250))
if abs((time.time() - currTimeIndex) - moves[currIndex][0]) > failRate: if abs((time.time() - currTimeIndex) - moves[currIndex][0]) > failRate:
currStatus = f"FAIL!" currStatus = f"FAIL!"
failCount += 1 failCount += 1
doStreak = False
if compare_poses_boolean(closest[1], normalized): if compare_poses_boolean(closest[1], normalized):
# delays += (time.time() - deltaTime - moves[0][0]) * 1000 # delays += (time.time() - deltaTime - moves[0][0]) * 1000
# delaysCount += 1 # delaysCount += 1
currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms" # currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms"
deltaTime = time.time() deltaTime = time.time()
currIndex = moves.index(closest) + 1 currIndex = moves.index(closest) + 1
goodCount += 1 goodCount += 1
changed = True changed = True
doStreak = True
if not changed and compare_poses_boolean(moves[currIndex][1], normalized): if not changed and compare_poses_boolean(moves[currIndex][1], normalized):
# delays += (time.time() - deltaTime - moves[0][0]) * 1000 # delays += (time.time() - deltaTime - moves[0][0]) * 1000
# delaysCount += 1 # delaysCount += 1
currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms" # currStatus = f"SUPER! {currIndex} Zostalo {len(moves)} Delay {(time.time() - currTimeIndex - closest[0]) / 1000}ms"
deltaTime = time.time() deltaTime = time.time()
changed = True changed = True
currIndex += 1 currIndex += 1
goodCount += 1 goodCount += 1
doStreak = True
# if do_pose_shot: # if do_pose_shot:
# moves.append((time.time() - startTime, normalize_pose(result.keypoints.xy.cpu().numpy()[0]), result.keypoints.xy.cpu()[0])) # moves.append((time.time() - startTime, normalize_pose(result.keypoints.xy.cpu().numpy()[0]), result.keypoints.xy.cpu()[0]))
# elif len(moves) != 0: # elif len(moves) != 0:
# with open('moves.pkl', 'wb') as f: # 'wb' = write binary # with open('moves.pkl', 'wb') as f: # 'wb' = write binary
# pickle.dump # pickle.dump
# (moves, f) # (moves, f)
# #
# exit(1) # exit(1)
cv2.putText( cv2.putText(
img, # obraz img, # obraz
currStatus, # tekst currStatus, # tekst
(50, 100), # pozycja (x, y) lewego dolnego rogu tekstu (50, 100), # pozycja (x, y) lewego dolnego rogu tekstu
cv2.FONT_HERSHEY_SIMPLEX, # czcionka cv2.FONT_HERSHEY_SIMPLEX, # czcionka
1, # rozmiar (skalowanie) 1, # rozmiar (skalowanie)
(0, 0, 255), # kolor (BGR) - tutaj czerwony (0, 0, 255), # kolor (BGR) - tutaj czerwony
2, # grubość linii 2, # grubość linii
cv2.LINE_AA # typ antyaliasingu cv2.LINE_AA # typ antyaliasingu
) )
cv2.imshow('Klatka z kamerki', img) cv2.imshow('Klatka z kamerki', img)
cv2.setMouseCallback('Klatka z kamerki', click_event) cv2.setMouseCallback('Klatka z kamerki', click_event)
cv2.waitKey(1) # Czekaj na naciśnięcie klawisza cv2.waitKey(1) # Czekaj na naciśnięcie klawisza
main() try:
while True:
main()
except KeyboardInterrupt:
pass

BIN
moves.pkl

Binary file not shown.

43
moves_3d.py Normal file
View File

@ -0,0 +1,43 @@
import cv2
import mediapipe as mp
import cv2
import mediapipe as mp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
cap = cv2.VideoCapture(0)
with mp_pose.Pose(
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as pose:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
# If loading a video, use 'break' instead of 'continue'.
continue
# To improve performance, optionally mark the image as not writeable to
# pass by reference.
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = pose.process(image)
print(f"\r{results.pose_world_landmarks[0]}", end="")
# Draw the pose annotation on the image.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
mp_drawing.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
# Flip the image horizontally for a selfie-view display.
landmarks = results.pose_world_landmarks.landmark
print(landmark)
cap.release()

60
moves_3d_mp4.py Normal file
View File

@ -0,0 +1,60 @@
import pickle
import time
import cv2
from ultralytics import YOLO
from calculate import normalize_pose
from utils import normalize
# Wczytanie wideo
cap = cv2.VideoCapture("input.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
width = 1920
height = 1080
# Ustawienia zapisu wideo
fourcc = cv2.VideoWriter_fourcc(*"avc1")
out = cv2.VideoWriter("output.mp4", fourcc, fps, (width, height))
# Wczytanie modelu YOLOv8 Pose
model = YOLO("yolo11x-pose.pt", verbose=False) # Twój model pose
moves = []
started = False
frame_id = 0
while True:
ok, frame = cap.read()
if not ok:
break
# Skalowanie do 640x640
frame_resized = cv2.resize(frame, (width, height))
# Wykrywanie poz
results = model.predict(frame_resized, verbose=False)
# Rysowanie punktów 2D
for result in results:
if result.keypoints is not None and len(result.keypoints.xy) > 0:
for keypoint in result.keypoints.xy[0]: # keypoints[0] bo dla jednej osoby
if not started:
frame_id = 0
started = True
x, y = keypoint # współrzędne + confidence
x = int(x)
y = int(y)
cv2.circle(frame_resized, (x, y), 5, (0, 255, 0), -1) # zielone kropki
moves.append((frame_id * 1 / fps, normalize_pose(result.keypoints.xy.cpu().numpy()[0]), normalize(result.keypoints.xy.cpu()[0]) * 160 + 250))
out.write(frame_resized)
frame_id += 1
with open('moves2.pkl', 'wb') as f: # 'wb' = write binary
pickle.dump(moves, f)
cap.release()
out.release()
print("Zapisano: output.mp4")

View File

@ -8,11 +8,26 @@ import numpy as np
import utils import utils
from draw import draw_new from draw import draw_new
moves = [] # moves = {}
better_moves = {} better_moves = {}
with open('moves.pkl', 'rb') as f: # 'rb' = read binary with open('replay_tpose.pkl', 'rb') as f: # 'rb' = read binary
moves = pickle.load(f) moves = pickle.load(f)
movesCopy = {}
for move in moves:
# listx = moves[move].tolist()
# print(type(listx))
# if type(listx) != list:
# listx = listx.tolist()
movesCopy[move.replace(".jpg", "")] = moves[move].tolist()
with open("plikv10.json", "w", encoding="utf-8") as f:
json.dump(movesCopy, f)
exit(1)
startValue = moves[0][0] startValue = moves[0][0]
totalCount = len(moves) totalCount = len(moves)
@ -36,7 +51,12 @@ for i, move in enumerate(moves):
# Do rysowania (np. przesunięcie na ekran) # Do rysowania (np. przesunięcie na ekran)
draw = utils.normalize(move[2]) draw = utils.normalize(move[2])
better_moves[round((move[0] - startValue) * 1000)] = draw.tolist()
cv2.imshow('you', draw_new(draw)) # cv2.imshow('you', draw_new(draw))
cv2.waitKey(1) # cv2.waitKey(1)
time.sleep(0.1) # time.sleep(0.1)
with open("plik-234.json", "w", encoding="utf-8") as f:
json.dump(better_moves, f)

47
moves_dump_2.py Normal file
View File

@ -0,0 +1,47 @@
import json
import pickle
import time
import cv2
import numpy as np
import utils
from draw import draw_new
moves = []
better_moves = {}
with open('moves.pkl', 'rb') as f: # 'rb' = read binary
moves = pickle.load(f)
startValue = moves[0][0]
totalCount = len(moves)
for i, move in enumerate(moves):
moves[i] = (move[0] - startValue, move[1], move[2])
# left_hip = move[2][11] # Left Hip
# right_hip = move[2][12] # Right Hip
# center = (left_hip + right_hip) / 2
#
# # Normalizacja względem środka ciała
# normalized_keypoints = move[2] - center
#
# better_moves[round((move[0] - startValue) * 1000)] = normalized_keypoints.tolist()
#
# # scale = utils.distance(move[2][11], move[2][12])
# # print(scale)
# draw = normalized_keypoints + 200
# Do rysowania (np. przesunięcie na ekran)
draw = utils.normalize(move[2])
better_moves[round((move[0] - startValue) * 1000)] = draw.tolist()
# cv2.imshow('you', draw_new(draw))
# cv2.waitKey(1)
# time.sleep(0.1)
with open("plik.json", "w", encoding="utf-8") as f:
json.dump(better_moves, f)

116
moves_videopose3d.py Normal file
View File

@ -0,0 +1,116 @@
import cv2
import torch
import numpy as np
from common.model import TemporalModel
from common.camera import *
# from common.utils import evaluate
from ultralytics import YOLO
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # not strictly needed in newer matplotlib
import time
# --- 1. Inicjalizacja modelu 3D VideoPose3D ---
model_3d = TemporalModel(
num_joints_in=17,
in_features=2,
num_joints_out=17,
filter_widths=[3,3,3,3],
causal=False
)
chk = torch.load("checkpoint/pretrained_h36m_detectron_coco.bin", map_location='cpu')
model_3d.load_state_dict(chk, strict=False)
model_3d.eval()
# --- 2. Inicjalizacja modelu YOLO (pose keypoints) ---
yolo = YOLO('yolo11s-pose.pt') # używamy najmniejszej wersji dla szybkości
# --- 3. Wczytanie wideo ---
cap = cv2.VideoCapture("input.mp4")
frame_buffer = []
BUFFER_SIZE = 243 # VideoPose3D potrzebuje sekwencji
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(111, projection='3d')
# inicjalizacja scatter i linii szkieletu
scatter = ax.scatter([], [], [], c='r')
skeleton = [ (0, 1), (1, 2), (2, 3), (0, 4), (4, 5), (5, 6), (0, 7), (7, 8), (8, 9), (7, 12), (12, 13), (13, 14), (7, 10), (10, 11), (11, 12) ]
skeleton_lines = []
for _ in skeleton:
line, = ax.plot([], [], [], c='b')
skeleton_lines.append(line)
ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(0, 2)
ax.view_init(elev=20, azim=-70)
plt.ion()
plt.show()
while True:
ret, frame = cap.read()
if not ret:
break
# --- 4. Detekcja keypointów z YOLO ---
results = yolo(frame)
if len(results) == 0 or len(results[0].keypoints.xy) == 0:
continue
# Zakładamy 1 osobę na klatkę (dla uproszczenia)
keypoints = results[0].keypoints.xy[0] # shape [17, 2]
keypoints = np.array(keypoints)
# Normalizacja do [0,1] (opcjonalnie zależnie od VideoPose3D)
keypoints[:, 0] /= frame.shape[1]
keypoints[:, 1] /= frame.shape[0]
frame_buffer.append(keypoints)
# --- 5. Jeśli mamy pełną sekwencję, predykcja 3D ---
skeleton = [
(0, 1), (1, 2), (2, 3), (0, 4), (4, 5), (5, 6),
(0, 7), (7, 8), (8, 9), (7, 12), (12, 13), (13, 14),
(7, 10), (10, 11), (11, 12)
]
# --- after getting pred_3d ---
if len(frame_buffer) == BUFFER_SIZE:
seq_2d = torch.tensor(np.array(frame_buffer)).unsqueeze(0).float()
with torch.no_grad():
pred_3d = model_3d(seq_2d)
pose_3d = pred_3d[0, -1].numpy() # [17,3]
# --- 2D overlay ---
# for i, kp in enumerate(frame_buffer[-1]):
# x, y = int(kp[0] * frame.shape[1]), int(kp[1] * frame.shape[0])
# cv2.circle(frame, (x, y), 5, (0, 255, 0), -1)
# cv2.imshow("2D Pose", frame)
# cv2.waitKey(1)
pose_3d = pose_3d[:, [0, 2, 1]] # X, Z, Y
pose_3d[:, 2] *= -1
# --- 3D update ---
xs, ys, zs = pose_3d[:, 0], pose_3d[:, 1], pose_3d[:, 2]
# update scatter
scatter._offsets3d = (xs, ys, zs)
# update skeleton lines
for idx, (a, b) in enumerate(skeleton):
skeleton_lines[idx].set_data([xs[a], xs[b]], [ys[a], ys[b]])
skeleton_lines[idx].set_3d_properties([zs[a], zs[b]])
plt.draw()
plt.pause(0.001)
print(pose_3d.tolist())
frame_buffer.pop(0)
cap.release()
cv2.destroyAllWindows()

1
poses.py Normal file
View File

@ -0,0 +1 @@
t_pose = [ 0.079178 , 0.1963 , 0.098774 , 0.033032 , 0.99646 , 0.08401 , 0.99999, 0.0049546, -0.99134 , 0.13132, -0.99791, -0.064541, 0.063086, 0.99801, -0.03562, 0.99936, -0.012939, 0.99992, 0.02004, 0.9998]

68
record.py Normal file
View File

@ -0,0 +1,68 @@
import pickle
import sys
import torch
from ultralytics import YOLO
import cv2
import time
import utils
from calculate import normalize_pose, compare_poses_boolean
from draw import draw_new
from utils import find_closest
from video_methods import initialize_method
model = YOLO("yolo11x-pose.pt")
model.to(torch.device('cuda:0'))
if len(sys.argv) == 2:
method_type = sys.argv[1]
else:
print("Podaj argument 'cam', albo 'net'.")
exit(1)
method = initialize_method(method_type)
do_pose_shot = False
startTime = 0
def click_event(event, x, y, flags, param):
global do_pose_shot, startTime
if event == cv2.EVENT_LBUTTONDOWN: # lewy przycisk myszy
do_pose_shot = not do_pose_shot
if do_pose_shot:
startTime = time.time()
def main():
moves = []
while True:
frame = method.receive_frame()
frame = cv2.flip(frame, 1)
results = model(frame, verbose=False)
if len(results) != 0:
result = results[0]
kpts = result.keypoints.data[0] if len(result.keypoints.data) else None
if kpts is None:
continue
img = frame
if do_pose_shot:
moves.append((time.time() - startTime, normalize_pose(result.keypoints.xy.cpu().numpy()[0]), result.keypoints.xy.cpu()[0]))
elif len(moves) != 0:
with open('moves.pkl', 'wb') as f: # 'wb' = write binary
pickle.dump(moves, f)
exit(1)
cv2.imshow('Klatka z kamerki', img)
cv2.setMouseCallback('Klatka z kamerki', click_event)
cv2.waitKey(1) # Czekaj na naciśnięcie klawisza
main()

58
record_one_pose.py Normal file
View File

@ -0,0 +1,58 @@
import pickle
import sys
import torch
from ultralytics import YOLO
import cv2
import time
import utils
from calculate import normalize_pose, compare_poses_boolean
from draw import draw_new
from utils import find_closest
from video_methods import initialize_method
model = YOLO("yolo11x-pose.pt")
model.to(torch.device('cuda:0'))
method = initialize_method("cam")
do_pose_shot = False
startTime = 0
def click_event(event, x, y, flags, param):
global do_pose_shot, startTime
if event == cv2.EVENT_LBUTTONDOWN: # lewy przycisk myszy
do_pose_shot = not do_pose_shot
if do_pose_shot:
startTime = time.time()
def main():
moves = []
while True:
frame = method.receive_frame()
frame = cv2.flip(frame, 1)
results = model(frame, verbose=False)
if len(results) != 0:
result = results[0]
kpts = result.keypoints.data[0] if len(result.keypoints.data) else None
if kpts is None:
continue
img = frame
if do_pose_shot:
print(normalize_pose(result.keypoints.xy.cpu().numpy()[0]))
exit(0)
cv2.imshow('Klatka z kamerki', img)
cv2.setMouseCallback('Klatka z kamerki', click_event)
cv2.waitKey(1) # Czekaj na naciśnięcie klawisza
main()

40
record_video_pose.py Normal file
View File

@ -0,0 +1,40 @@
import glob
import pickle
from tqdm import tqdm
import torch
from ultralytics import YOLO
import cv2
import time
import utils
from calculate import normalize_pose, compare_poses_boolean
from draw import draw_new
from utils import find_closest
from video_methods import initialize_method
model = YOLO("yolo11x-pose.pt")
model.to(torch.device('cuda:0'))
startTime = 0
def main():
moves = []
for i in tqdm(sorted(glob.glob("video/camA/*.jpg"), key=lambda f: int(__import__("re").search(r"\d+", f).group()))):
data = i.replace(f'video/camA\\', "")
frame = cv2.imread(f"video/camA/{data}")
results = model(frame, verbose=False)
if len(results) != 0:
result = results[0]
kpts = result.keypoints.data[0] if len(result.keypoints.data) else None
if kpts is None:
continue
moves.append((int(data.replace(".jpg", "")), normalize_pose(result.keypoints.xy.cpu().numpy()[0]), result.keypoints.xy.cpu()[0]))
with open('moves_makarena_best.pkl', 'wb') as f: # 'wb' = write binary
pickle.dump(moves, f)
main()

19
rotate.py Normal file
View File

@ -0,0 +1,19 @@
import cv2
import os
folder = r"video/camC" # ← podaj swoją ścieżkę
# rozszerzenia jakie chcesz obracać
ext = (".jpg", ".jpeg", ".png")
for filename in os.listdir(folder):
if filename.lower().endswith(ext):
path = os.path.join(folder, filename)
img = cv2.imread(path)
rotated = cv2.rotate(img, cv2.ROTATE_180)
cv2.imwrite(path, rotated) # nadpisanie pliku
print(f"Obrócono: {filename}")
print("Gotowe ✔️")

View File

@ -15,21 +15,26 @@ def recvall(sock, n):
def distance(p1, p2): def distance(p1, p2):
return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)
def normalize(move): import numpy as np
left_hip = move[11] # Left Hip
right_hip = move[12] # Right Hip
def normalize(move):
left_hip = move[11] # Left Hip
right_hip = move[12] # Right Hip
nose = move[0] # Nose (głowa)
# Środek bioder
center = (left_hip + right_hip) / 2 center = (left_hip + right_hip) / 2
# Przesunięcie względem środka
normalized_keypoints = move - center normalized_keypoints = move - center
distances = np.linalg.norm(normalized_keypoints[:, :2], axis=1)
max_dist = np.max(distances)
if max_dist > 0: # Zamiast max_dist używamy stałej miary "rozmiaru ciała"
normalized_keypoints[:, :2] /= max_dist body_height = np.linalg.norm(nose[:2] - center[:2]) # np. odległość biodra-głowa
if body_height > 0:
normalized_keypoints[:, :2] /= body_height
draw = normalized_keypoints[:, :2] draw = normalized_keypoints[:, :2]
return draw return draw
def find_closest(moves, target): def find_closest(moves, target):