Week 5 · 課程作業

Touchless HMI
無接觸虛擬人機介面

基於 Flask + OpenCV + MediaPipe Hands 建構的 AI 網頁攝影機手勢控制系統

Python · Flask MediaPipe Hands OpenCV · Webcam Raspberry Pi 5
學生姓名:陳黃英 | 學號:1111310033

01 · 系統介紹

Web Camera 無接觸虛擬人機介面

🎯 專案目標

建立一套完全不需接觸實體裝置的人機介面系統(Touchless HMI),使用者可透過鏡頭前的手勢動作操控電腦,包含游標移動、點擊、投影片切換、音量調整,以及空中動態簽名身份驗證。

🖥️ 運行環境

硬體採用 Raspberry Pi 5(IP: 192.168.1.114)搭配 USB 攝影機;開發端使用 Notebook(IP: 192.168.1.101),透過 Flask Web Server 提供跨裝置瀏覽器存取。

🤖 AI 核心技術

採用 Google 的 MediaPipe Hands 即時辨識手部 21 個關節點,結合自訂手勢識別邏輯,實現毫秒級的手勢判斷與對應操作觸發。

🌐 系統特色

純 Web 介面(Flask + HTML/CSS/JS),無需安裝客戶端,在區域網路內任何裝置的瀏覽器皆可存取。支援即時 MJPEG 串流與響應式版面設計。

21
手部關節點
30+
FPS 即時處理
5
手勢動作類型
640×480
攝影機解析度

02 · 資訊專案結構

檔案架構說明

📁 TOUCHLESS_HMI/
📂__pycache__Python 快取
📂.venv虛擬環境
📂static/
🎨style.css全域樣式
⚙️app.js手勢控制邏輯
📂templates/
🌐index.html主介面
🐍app.pyFlask 主程式
🐍gesture_utils.py手勢辨識模組
📄README.md說明文件
📄requirements.txt依賴套件

app.py — Flask 後端核心

負責 Webcam 串流、呼叫手勢辨識模組、提供 REST API 端點(/video_feed, /gesture_data),並啟動 Flask 伺服器於 port 5000。

gesture_utils.py — 手勢邏輯

封裝 MediaPipe Hands 初始化、關節點座標擷取、各種手勢條件判斷(捏合、揮手、旋轉等),回傳結構化的手勢結果字典。

index.html + app.js — 前端介面

顯示即時攝影機畫面與虛擬鍵盤/滑鼠面板;app.js 透過 fetch 輪詢手勢資料並驅動 DOM 動畫與游標移動。


03 · 系統架構圖 (UML) 與程式邏輯

系統環境圖與資料流

以下架構圖說明從攝影機影像輸入到手勢辨識輸出、最終觸發 HMI 操作的完整資料流。

INPUT
USB Webcam
640×480 px
CAPTURE
OpenCV
cv2.VideoCapture
AI DETECT
MediaPipe
21 Landmarks
LOGIC
gesture_utils
Rule-based
SERVER
Flask API
Port 5000
OUTPUT
Browser HMI
Virtual KBD/Mouse

程式邏輯說明


04 · 全系統功能

核心技術與功能說明

👆

虛擬滑鼠控制

偵測食指(INDEX_TIP)位置映射為螢幕游標座標,當食指單獨伸出時進入游標模式,平滑移動虛擬滑鼠。

🤏

捏合點擊(Pinch Click)

計算大拇指尖(THUMB_TIP)與食指尖(INDEX_TIP)之間的歐氏距離,當距離小於閾值時觸發「滑鼠左鍵點擊」事件。

👋

揮手切換投影片

偵測手掌在水平方向的快速位移(速度 > 閾值),向左揮手觸發「上一頁」,向右揮手觸發「下一頁」。

🌀

手掌旋轉調整參數

計算手腕到中指根部連線的旋轉角度(θ),旋轉角度映射為音量/亮度數值,實現連續參數調整。

✍️

動態空中簽名

食指軌跡記錄為時序座標序列,透過 DTW(動態時間規整)演算法比對已註冊的簽名模板,完成身份驗證。

📡

MJPEG 即時串流

使用 Flask Generator + multipart/x-mixed-replace,以每幀 JPEG 格式串流至瀏覽器,實現低延遲即時畫面更新。


05 · 實施過程

實施過程

1下載Python

下載Python

2請按照說明建立文件結構

請按照說明建立文件結構

3結果

結果

06 · AI 工具對話連結

使用 AI 工具輔助開發

Claude Code — AI 自動完成系統建構

使用 Claude Code 工具,輸入需求後自動生成完整 Flask + MediaPipe 專案架構,並部署至 Raspberry Pi 5。

Claude (claude.ai) — 程式邏輯諮詢

提問:「我有 Raspberry Pi 5,我裝了 USB-CAMERA,幫我建立一個使用 Raspberry Pi + USB Web Camera + OpenCV + Flask 建立一個 AI 網頁攝影機系統」

Claude 對話連結 — 本次作業 AI 諮詢紀錄

本次課程作業透過 Claude 進行系統設計、程式邏輯討論與問題排除的完整對話紀錄。


07 · Trouble Shooting

問題排除紀錄

# 問題描述 原因分析 解決方法 狀態
01 MediaPipe 在 Pi 5 上安裝失敗 ARM64 平台缺乏預編譯 wheel 改用 mediapipe-rpi4 分支或從源碼編譯 已解決
02 攝影機畫面延遲過高(>1s) JPEG 品質設 100% 導致每幀過大 調整 JPEG_QUALITY = 80,降低解析度至 640×480 已解決
03 食指游標抖動嚴重 直接映射原始座標,無平滑處理 加入移動平均濾波(window=5幀)平滑座標 已解決
04 捏合誤觸發率高 閾值設定過鬆(0.1) 縮小閾值至 0.04,並加入連續 3 幀確認機制 已解決
05 簽名驗證準確率不穩 DTW 對簽名速度敏感,快慢差異大 正規化時序長度後再比對,提升至 85% 準確率 持續優化

08 · 學習心得

學習心得與總結

本週透過 AI 工具(Claude Code)協助,大幅縮短了從需求描述到可運行系統的時間。以往需要花數天查閱文件、Debug 的過程,現在只需清楚描述需求,AI 即可生成完整架構,我們的工作轉為「驗證、調整、理解」,而非從零撰寫。

MediaPipe Hands 的 21 個關節點座標系統令人印象深刻——不只偵測手的位置,還能推算每根手指的角度與彎曲程度。理解關節點索引(如 4=拇指尖、8=食指尖)之後,手勢邏輯的實作變得非常直觀。

Flask 的 MJPEG 串流模式(multipart/x-mixed-replace)是這次最大的收穫之一——它讓 Python 後端可以「持續推送」影像至瀏覽器,而不需要 WebSocket,架構簡單卻效果出色。這個技術可以應用於許多 IoT 監控場景。

最具挑戰性的部分是「使用者體驗的細節」:游標平滑化、誤觸防抖、手勢意圖判斷的邊界條件。這些不是 AI 能完全幫忙的部分,需要反覆測試與調整。這讓我體會到,AI 工具能加速「知識型」的工作,但「體驗型」的細節仍需人的判斷。