From b9753701cb0830d084cf98aa3d307c7ee8984e07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Dec 2025 08:55:01 +0000 Subject: [PATCH 1/2] Initial plan From f99704298825eb9f2d67eaf66b9abe9f802cbeb1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 20 Dec 2025 08:58:12 +0000 Subject: [PATCH 2/2] Fix MediaPipe demo programs - add missing imports, fix camera index, improve exit handling and update documentation Co-authored-by: willismax <2055349+willismax@users.noreply.github.com> --- 08.OpenCV-Mediapipe-DEMO/app-hands.py | 9 ++++++--- 08.OpenCV-Mediapipe-DEMO/app-holistic.py | 9 ++++++--- 08.OpenCV-Mediapipe-DEMO/app-pose.py | 9 ++++++--- 08.OpenCV-Mediapipe-DEMO/handle-hand-demo.py | 3 ++- 08.OpenCV-Mediapipe-DEMO/readme.md | 14 ++++++++++---- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/08.OpenCV-Mediapipe-DEMO/app-hands.py b/08.OpenCV-Mediapipe-DEMO/app-hands.py index 6f5c8b4..c40fe38 100644 --- a/08.OpenCV-Mediapipe-DEMO/app-hands.py +++ b/08.OpenCV-Mediapipe-DEMO/app-hands.py @@ -2,7 +2,7 @@ import mediapipe as mp import time -cap = cv2.VideoCapture(1) +cap = cv2.VideoCapture(0) mpHands = mp.solutions.hands hands = mpHands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5) @@ -42,5 +42,8 @@ cv2.imshow('img', img) - if cv2.waitKey(1) == ord('q'): - break \ No newline at end of file + if cv2.waitKey(1) == ord('q') or cv2.waitKey(1) == 27: + break + +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/08.OpenCV-Mediapipe-DEMO/app-holistic.py b/08.OpenCV-Mediapipe-DEMO/app-holistic.py index b934fa2..6abf2cc 100644 --- a/08.OpenCV-Mediapipe-DEMO/app-holistic.py +++ b/08.OpenCV-Mediapipe-DEMO/app-holistic.py @@ -1,5 +1,6 @@ import cv2 import mediapipe as mp +import numpy as np mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles @@ -7,6 +8,7 @@ # For static images: IMAGE_FILES = [] +BG_COLOR = (192, 192, 192) # gray with mp_holistic.Holistic( static_image_mode=True, model_complexity=2, @@ -53,7 +55,7 @@ results.pose_world_landmarks, mp_holistic.POSE_CONNECTIONS) # For webcam input: -cap = cv2.VideoCapture(1) +cap = cv2.VideoCapture(0) with mp_holistic.Holistic( min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: @@ -88,6 +90,7 @@ .get_default_pose_landmarks_style()) # Flip the image horizontally for a selfie-view display. cv2.imshow('MediaPipe Holistic', cv2.flip(image, 1)) - if cv2.waitKey(5) & 0xFF == 27: + if cv2.waitKey(5) & 0xFF == 27 or cv2.waitKey(5) == ord('q'): break -cap.release() \ No newline at end of file +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/08.OpenCV-Mediapipe-DEMO/app-pose.py b/08.OpenCV-Mediapipe-DEMO/app-pose.py index 63e0099..8f56c1e 100644 --- a/08.OpenCV-Mediapipe-DEMO/app-pose.py +++ b/08.OpenCV-Mediapipe-DEMO/app-pose.py @@ -1,5 +1,7 @@ import cv2 import mediapipe as mp +import numpy as np + mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles mp_pose = mp.solutions.pose @@ -46,7 +48,7 @@ results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS) # For webcam input: -cap = cv2.VideoCapture(1) +cap = cv2.VideoCapture(0) with mp_pose.Pose( min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose: @@ -73,6 +75,7 @@ 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: + if cv2.waitKey(5) & 0xFF == 27 or cv2.waitKey(5) == ord('q'): break -cap.release() \ No newline at end of file +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/08.OpenCV-Mediapipe-DEMO/handle-hand-demo.py b/08.OpenCV-Mediapipe-DEMO/handle-hand-demo.py index c69a98e..10e6f87 100644 --- a/08.OpenCV-Mediapipe-DEMO/handle-hand-demo.py +++ b/08.OpenCV-Mediapipe-DEMO/handle-hand-demo.py @@ -140,9 +140,10 @@ def detect(): center_y = int(keypoint_pos[node][1]) frame = mosaic(frame, [center_x - 15 , center_y - 10], [center_x + 30, center_y + 50]) cv2.imshow('MediaPipe Hands', frame) - if cv2.waitKey(1) & 0xFF == 27: + if cv2.waitKey(1) & 0xFF == 27 or cv2.waitKey(1) == ord('q'): break cap.release() + cv2.destroyAllWindows() if __name__ == '__main__': detect() diff --git a/08.OpenCV-Mediapipe-DEMO/readme.md b/08.OpenCV-Mediapipe-DEMO/readme.md index fd6ee55..f4b53bb 100644 --- a/08.OpenCV-Mediapipe-DEMO/readme.md +++ b/08.OpenCV-Mediapipe-DEMO/readme.md @@ -4,11 +4,11 @@ ## OpenCV + MediaPipe -- 建議使用pipenv虛擬環境,本案例採python 3.8,相依外部套件可透過`pipenv sync`將`Pipfile.lock`內鎖定的相依套件進行安裝。 +- 建議使用pipenv虛擬環境,本案例採python 3.10以上,相依外部套件可透過`pipenv install`安裝所需套件。 ``` pipenv --python 3.10 - pipenv sync + pipenv install ``` - pipenv相關命令: @@ -20,14 +20,20 @@ - 執行程式: - `pipenv shell` 進入虛擬環境後,選擇自己想執行的程式開啟,開啟後按`esc`或`q`離開。 + `pipenv shell` 進入虛擬環境後,選擇自己想執行的程式開啟,開啟後按`ESC`或`q`離開。 - ``` + ```bash python app-hands.py #手部辨識 python app-holistic.py #肢體辨識 python app-pose.py #姿態辨識 + python handle-hand-demo.py #手勢辨識(愛心/中指) ``` +- 注意事項: + - 程式預設使用編號0的攝影機(通常是主要攝影機) + - 如果有多個攝影機,可以在程式碼中修改`cv2.VideoCapture(0)`的數字 + - 執行時需要允許程式存取攝影機權限 + ## 參考: