Skip to content
Merged
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
5da6438
利用预训练的卷积神经网络提取图像的内容特征和风格特征
sda-57 Sep 28, 2025
2be8ac7
Merge branch 'OpenHUTB:main' into main
sda-57 Sep 29, 2025
7be9975
Merge branch 'OpenHUTB:main' into main
sda-57 Sep 29, 2025
9c9ad52
Update README.md
sda-57 Sep 29, 2025
5de5f6c
Merge branch 'OpenHUTB:main' into main
sda-57 Sep 29, 2025
5544545
Merge branch 'OpenHUTB:main' into main
sda-57 Oct 20, 2025
45005f1
处理 checkpoint 路径获取逻辑,增强可读性、添加更明确的错误处理和边界情况处理
sda-57 Oct 20, 2025
0662acb
Merge branch 'OpenHUTB:main' into main
sda-57 Nov 3, 2025
d31a167
在ubuntu上初步运行了项目,生成了部分效果图
sda-57 Nov 3, 2025
5c2fb42
Merge branch 'OpenHUTB:main' into main
sda-57 Nov 4, 2025
a94b7fc
Merge branch 'OpenHUTB:main' into main
sda-57 Nov 7, 2025
997bee5
规范了项目名字,将 wandb 初始化逻辑拆分为setup_wandb函数,使主函数结构更清晰,提交项目的部分效果图
sda-57 Nov 7, 2025
5c38f97
Merge branch 'OpenHUTB:main' into main
sda-57 Nov 11, 2025
6aef0c0
初步运行了项目,生成了部分效果图,上传了新的main.py
sda-57 Nov 11, 2025
c4a5fad
Merge branch 'OpenHUTB:main' into main
sda-57 Nov 24, 2025
3367e7b
成功运行了新的子项目tracking,实现了追踪效果
sda-57 Nov 24, 2025
0bc5b3e
Merge branch 'OpenHUTB:main' into main
sda-57 Nov 28, 2025
d4256d7
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 2, 2025
c84d0cc
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 2, 2025
3ccbaf1
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 4, 2025
9d7e246
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 5, 2025
898da0b
运行了新的子项目choice reaction,并成功生成了可以选择不同色块的动图
sda-57 Dec 5, 2025
a3ff8a6
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 9, 2025
fb449bb
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 9, 2025
0a3371c
运行子项目RC Car via Joystick(遥控车),并成功生成了动图
sda-57 Dec 9, 2025
bc5a8fe
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 10, 2025
e370585
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 11, 2025
7f4a77c
更新readme,在原来的readme基础上,对子项目的细节进行补充和总结优化
sda-57 Dec 11, 2025
f2b9394
更新readme,在原来的readme基础和在老师的指导下,对于上次问题的修正和子项目的细节进行补充和总结优化
sda-57 Dec 11, 2025
f187712
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 12, 2025
e187257
更新readme,在原来的readme基础和在老师的指导下,对于上次问题的修正和子项目的细节进行补充和总结优化
sda-57 Dec 12, 2025
a4f5fcf
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 15, 2025
b82adc4
运行子项目BeatSVR 双手协同模拟器,并成功生成动图
sda-57 Dec 15, 2025
d1a21a6
Merge branch 'OpenHUTB:main' into main
sda-57 Dec 15, 2025
66eb264
生成BeatSVR 双手协同评估环境的相机视角动图,为 BeatSVR 双手协同模拟器添加评估
sda-57 Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from __future__ import annotations
import argparse
from pathlib import Path

import numpy as np
import imageio.v2 as imageio
from PIL import Image


def mp4_to_gif(mp4_path: Path, gif_path: Path, target_width: int = 640, fps: int = 15) -> None:
"""Convert one MP4 to GIF with fps downsampling and width resize."""
reader = imageio.get_reader(str(mp4_path))
meta = reader.get_meta_data()
src_fps = float(meta.get("fps", 20.0))

# Downsample frames to target fps
step = max(1, int(round(src_fps / float(fps))))

gif_path.parent.mkdir(parents=True, exist_ok=True)
writer = imageio.get_writer(str(gif_path), mode="I", fps=fps, loop=0)

try:
for i, frame in enumerate(reader):
if i % step != 0:
continue

im = Image.fromarray(frame)
w, h = im.size
if target_width and w != target_width:
new_h = int(h * target_width / w)
im = im.resize((target_width, new_h), resample=Image.Resampling.LANCZOS)

writer.append_data(np.array(im))
finally:
writer.close()
reader.close()


def main() -> None:
p = argparse.ArgumentParser()
p.add_argument("--inputs", nargs="+", required=True, help="Input mp4 files (paths).")
p.add_argument("--out_dir", default=".", help="Output folder.")
p.add_argument("--fps", type=int, default=15, help="GIF FPS.")
p.add_argument("--width", type=int, default=640, help="Output GIF width (keep aspect).")
args = p.parse_args()

out_dir = Path(args.out_dir)
for in_path_str in args.inputs:
in_path = Path(in_path_str)
if not in_path.exists():
raise FileNotFoundError(f"Input not found: {in_path}")

gif_name = in_path.with_suffix(".gif").name
out_path = out_dir / gif_name
mp4_to_gif(in_path, out_path, target_width=args.width, fps=args.fps)
print(f"[OK] {in_path} -> {out_path}")


if __name__ == "__main__":
main()
Loading