目錄
準備工作如何在Windows系統中安裝OpenCV和MediaPipe庫?
安裝Python
安裝OpenCV
安裝MediaPipe
驗證安裝
代碼邏輯
整體代碼
效果展示
準備工作如何在Windows系統中安裝OpenCV和MediaPipe庫?
安裝Python
????可以通過命令行運行python --version
來檢查版本號。如果沒有安裝,可以從Python官方網站下載并安裝。
安裝OpenCV
-
打開命令提示符(Command Prompt)。
-
輸入以下命令來安裝OpenCV-python:
pip install opencv-python
如果你也需要OpenCV的額外模塊(如SIFT、SURF等),可以運行:
pip install opencv-contrib-python
安裝MediaPipe
安裝MediaPipe同樣簡單,只需要在命令提示符下運行:
pip install mediapipe
驗證安裝
為了驗證OpenCV和MediaPipe是否成功安裝,可以在命令提示符中啟動Python解釋器,然后嘗試導入這兩個庫:
import cv2
import mediapipe as mp
print(cv2.__version__)
print(mp.__version__)
如果打印出了版本號,安裝成功。
代碼邏輯
-
導入必要的庫:
cv2
: OpenCV庫,用于處理圖像和視頻。mediapipe as mp
: MediaPipe庫,提供了一種簡單的方法來訪問先進的機器學習模型,這里用于人體姿態估計。time
: 用于時間相關的操作,比如計算FPS。
-
初始化MediaPipe姿勢檢測對象:
- 使用
mp_pose.Pose()
創建了一個姿勢檢測器對象,設置了最小檢測置信度和跟蹤置信度為0.5。
- 使用
-
打開攝像頭獲取視頻流:
- 使用
cv2.VideoCapture(0)
打開默認攝像頭。
- 使用
-
主循環開始:
- 在
while cap.isOpened():
循環中不斷讀取攝像頭數據。
- 在
-
處理每一幀圖像:
- 首先檢查是否成功讀取圖像。
- 然后計算當前幀的FPS。
- 將BGR格式的圖像轉換為RGB格式,因為MediaPipe需要RGB格式的輸入。
- 使用姿勢檢測器對象對圖像進行處理,得到關鍵點位置。
-
繪制關鍵點和連接線:
- 如果檢測到了關鍵點(
results.pose_landmarks
),則使用mp_drawing.draw_landmarks()
函數在圖像上繪制這些關鍵點及其連接線。 - 可以自定義關鍵點和連線的顏色、粗細等屬性。
- 如果檢測到了關鍵點(
-
顯示FPS信息:
- 在圖像上顯示當前幀的FPS值,幫助用戶了解程序運行的流暢度。
-
展示結果并監聽退出指令:
- 使用
cv2.imshow()
展示處理后的圖像。 - 監聽鍵盤事件,當按下'q'鍵時退出循環,釋放資源并關閉所有窗口。
- 使用
整體代碼
import cv2 # 導入 OpenCV 庫,用于圖像處理和顯示
import mediapipe as mp # 導入 MediaPipe 庫,用于姿勢檢測
import time # 導入時間模塊,用于計算 FPS# 初始化 MediaPipe 的繪圖工具和姿勢檢測模型
mp_drawing = mp.solutions.drawing_utils # 用于繪制關鍵點和連接線
mp_pose = mp.solutions.pose # 用于姿勢檢測# 打開攝像頭
cap = cv2.VideoCapture(0) # 0 表示默認攝像頭,如果有多個攝像頭可以嘗試 1, 2, 等# 初始化 FPS 計算相關變量
prev_time = 0 # 用于存儲上一幀的時間戳# 使用 MediaPipe 的姿勢檢測模型
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("無法讀取攝像頭畫面。")break# --- 計算 FPS ---curr_time = time.time() # 獲取當前幀的時間戳dt = curr_time - prev_time # 計算與上一幀的時間間隔(秒)fps = 1 / dt if dt != 0 else 0 # 計算幀率(FPS),避免除以零錯誤prev_time = curr_time # 更新上一幀的時間戳# 將圖像從 BGR 格式轉換為 RGB 格式(MediaPipe 需要 RGB 格式)image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 使用姿勢檢測模型處理圖像results = pose.process(image_rgb)# 如果檢測到姿勢關鍵點,繪制關鍵點和連接線if results.pose_landmarks:mp_drawing.draw_landmarks(image, # 要繪制的圖像results.pose_landmarks, # 檢測到的姿勢關鍵點mp_pose.POSE_CONNECTIONS, # 定義關鍵點之間的連接線landmark_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2), # 關鍵點的顏色和粗細connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=2) # 連接線的顏色和粗細)# --- 在畫面上顯示 FPS ---fps_text = "FPS: {:.2f}".format(fps) # 格式化 FPS 值,保留兩位小數cv2.putText(image, # 要繪制的圖像fps_text, # 顯示的文本內容(10, 30), # 文本位置(左上角,距離左邊 10 像素,距離頂部 30 像素)cv2.FONT_HERSHEY_SIMPLEX, # 字體類型1, # 字體大小(0, 255, 0), # 字體顏色(綠色)2 # 字體粗細)# 顯示處理后的圖像cv2.imshow('Real-Time Pose Detection', image)# 檢測按鍵輸入,如果按下 'q' 鍵則退出循環if cv2.waitKey(1) & 0xFF == ord('q'):break# 釋放攝像頭資源
cap.release()# 關閉所有 OpenCV 窗口
cv2.destroyAllWindows()
效果展示
?