Hệ thống retarget cử động bàn tay theo thời gian thực: MediaPipe + DepthAI/Optical Flow ở backend, Three.js ở frontend. README này chứa toàn bộ hướng dẫn chạy và yêu cầu kỹ thuật cần thiết.
- Tổng quan & luồng xử lý
- Yêu cầu kỹ thuật
- Thiết lập môi trường
- Chạy hệ thống
- Cấu hình & tips
- Cấu trúc thư mục
Pipeline xử lý mỗi khung hình (30 FPS mục tiêu):
[Webcam/OAK] → MediaPipe Hand Landmarker → Landmark packets
↓
Pose Solver (Kabsch + finger quats)
↓
Optical Flow (Lucas–Kanade per landmark)
↓
WebSocket stream → Three.js Skeleton Retarget
-
Backend (Python)
- Ghi hình camera (webcam/OAK) tại
backend/capture.py. - MediaPipe Hand Landmarker để lấy 21 điểm và handedness.
PoseSolvertính quaternion gốc bằng Kabsch + giới hạn khớp ngón.- Lucas–Kanade optical flow để theo dõi chuyển động.
- WebSocket server (
api.py) phát dữ liệu JSON theo thời gian thực.
- Ghi hình camera (webcam/OAK) tại
-
Frontend (Three.js + Vite)
- Kết nối WebSocket, nhận landmarks/quaternions/motion.
- Ánh xạ vào skeleton GLB, cho phép chỉnh JSON mapping, hiển thị video.
-
Shared data
hand_mapping.json: ánh xạ landmarks → bones.data/: nơi lưu kết quả thử nghiệm (tuỳ chọn).
- PC/Laptop với CPU đa nhân; GPU rời giúp Three.js hiển thị mượt hơn.
- Webcam ≥ 720p @ 30 FPS (bắt buộc).
- Tùy chọn: camera OAK/DepthAI (USB 3.0) nếu muốn chạy palm detection on-device.
- Windows, macOS hoặc Linux (đã thử trên Windows 11).
- Python >= 3.10 cùng
pipvà quyền cài đặt gói hệ thống. - Node.js LTS (khuyến nghị 18.x hoặc 20.x) + npm (đi kèm Node).
- Git (để clone repository nếu cần).
- Trình duyệt hỗ trợ WebGL 2 (Chrome, Edge, Firefox, v.v.).
git clone <repo-url>
cd handmappingcd backend
python -m venv .venv # tùy chọn nhưng khuyến nghị
.venv\Scripts\activate # PowerShell/CMD trên Windows
pip install --upgrade pip
pip install -r requirements.txtLưu ý DepthAI: cắm thiết bị OAK trước khi chạy lần đầu để quá trình cài
depthaitải firmware cần thiết.
cd frontend
npm installVite dùng cấu hình mặc định (port 5173). Mọi assets ở frontend/public hoặc import trực tiếp trong app.js.
cd backend
python api.py --host 0.0.0.0 --port 8765 # tham số tùy chọn- WebSocket:
ws://<host>:<port>/ws - Health check:
http://<host>:<port>/health - Log sẽ cho biết khi webcam mở thành công và khi client kết nối.
cd frontend
npm run dev- Truy cập
http://localhost:5173(hoặc URL Vite hiển thị) bằng trình duyệt. - Kiểm tra tab Console nếu không thấy dữ liệu WebSocket.
- Mở trang frontend để sẵn sàng nhận dữ liệu.
- Nhấn "Connect" (nếu UI yêu cầu) hoặc chờ kết nối tự động tới
ws://localhost:8765/ws. - Khi bàn tay xuất hiện ổn định, nhấn nút thiết lập Bind Pose để khóa tư thế gốc.
- Dùng UI mapping để gán landmarks → bones, lưu lại để backend tải
hand_mapping.jsonmới.
- Chọn webcam khác: chỉnh chỉ số camera tại
backend/capture.py(mặc định 0). Khởi động lại backend sau khi sửa. - Mapping: file
hand_mapping.jsonở thư mục gốc. Bạn có thể chỉnh thủ công hoặc dùng UI kéo-thả ở frontend rồi bấm "Save" để ghi đè. - Tùy biến host/port: truyền
--hostvà--portchoapi.py(thông quaargparseở cuối file) hoặc sửa mặc định trongHandTrackingServer. - Chế độ debug reload: khởi chạy
HandTrackingServer(debug=True)nếu muốn tự động reload backend khi file Python thay đổi. - DepthAI/OAK: khi thiết bị được phát hiện,
capture.pyưu tiên stream từ OAK; nếu không, hệ thống quay lại webcam tiêu chuẩn. - Băng thông WebSocket: dữ liệu ~2–5 KB/frame. Đảm bảo cùng LAN hoặc localhost để tránh độ trễ.
- Không mở được webcam: kiểm tra thiết bị khác đang sử dụng camera, hoặc dùng
capture.open(index=1)với camera phụ. - Frontend không nhận dữ liệu: xác minh backend in "Client connected" và kiểm tra console trình duyệt xem có lỗi CORS / WebSocket.
- FPS thấp: giảm độ phân giải trong
capture.pyhoặc tắt Optical Flow (flow.py) nếu chỉ cần landmarks. - Sai hướng mô hình: sử dụng các tùy chọn xoay trong
frontend/app.js(phầnload3DModel) để tinh chỉnh hướng GLB.
handmapping/
├─ backend/
│ ├─ api.py # HTTP/WebSocket server + tracking loop
│ ├─ capture.py # Webcam/OAK capture wrapper
│ ├─ mp_hands.py # MediaPipe Tasks wrapper
│ ├─ pose_solver.py # Kabsch + quaternion utilities
│ ├─ flow.py # Lucas–Kanade optical flow
│ └─ requirements.txt # Backend dependencies
├─ frontend/
│ ├─ app.js # Three.js scene & mapping UI
│ ├─ index.html # Entry point served by Vite
│ └─ package.json # Frontend dependencies/scripts
├─ data/ # Mẫu dữ liệu thử nghiệm (tùy chọn)
├─ hand_mapping.json # Ánh xạ landmarks ↔ bones
└─ README.md # Tài liệu hướng dẫn này
Chúc bạn retarget vui vẻ!