時間:2022-12-10來源:www.djmaza-info.com作者:電腦系統城
本篇文章適合剛入門OpenCV的同學們。文章將介紹如何使用Python利用OpenCV圖像捕捉,配合強大的Mediapipe庫來實現手勢檢測與識別;本系列后續還會繼續更新Mediapipe手勢的各種衍生項目,還請多多關注!
視頻捕捉幀數穩定在(25-30)
項目的實現,核心是強大的Mediapipe ,它是google的一個開源項目:
功能 | 詳細 |
---|---|
人臉檢測 FaceMesh | 從圖像/視頻中重建出人臉的3D Mesh |
人像分離 | 從圖像/視頻中把人分離出來 |
手勢跟蹤 | 21個關鍵點的3D坐標 |
人體3D識別 | 33個關鍵點的3D坐標 |
物體顏色識別 | 可以把頭發檢測出來,并圖上顏色 |
Mediapipe Dev:https://mediapipe.dev/
以上是Mediapipe的幾個常用功能 ,這幾個功能我們會在后續一一講解實現
Python安裝Mediapipe
1 | pip install mediapipe = = 0.8 . 9.1 |
也可以用 setup.py 安裝
https://github.com/google/mediapipe
Python 3.7
Mediapipe 0.8.9.1
Numpy 1.21.6
OpenCV-Python 4.5.5.64
OpenCV-contrib-Python 4.5.5.64
實測也支持Python3.8-3.9
OpenCV攝像頭捕捉部分:
1 2 3 4 5 6 7 8 9 |
import cv2 cap = cv2.VideoCapture( 0 ) #OpenCV攝像頭調用:0=內置攝像頭(筆記本) 1=USB攝像頭-1 2=USB攝像頭-2 while True : success, img = cap.read() imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #cv2圖像初始化 cv2.imshow( "HandsImage" , img) #CV2窗體 cv2.waitKey( 1 ) #關閉窗體 |
mediapipe 手勢識別與繪制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#定義并引用mediapipe中的hands模塊 mpHands = mp.solutions.hands hands = mpHands.Hands() mpDraw = mp.solutions.drawing_utils while True : success, img = cap.read() imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #cv2圖像初始化 results = hands.process(imgRGB) # print(results.multi_hand_landmarks) if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id , lm in enumerate (handLms.landmark): # print(id, lm) h, w, c = img.shape cx, cy = int (lm.x * w), int (lm.y * h) print ( id , cx, cy) # if id == 4: cv2.circle(img, (cx, cy), 15 , ( 255 , 0 , 255 ), cv2.FILLED) #繪制手部特征點: mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS) |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import time #幀率時間計算 pTime = 0 cTime = 0 while True cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str ( int (fps)), ( 10 , 70 ), cv2.FONT_HERSHEY_PLAIN, 3 , ( 255 , 0 , 255 ), 3 ) #FPS的字號,顏色等設置 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# Coding BIGBOSSyifi # Datatime:2022/4/24 21:41 # Filename:HandsDetector.py # Toolby: PyCharm import cv2 import mediapipe as mp import time cap = cv2.VideoCapture( 0 ) #OpenCV攝像頭調用:0=內置攝像頭(筆記本) 1=USB攝像頭-1 2=USB攝像頭-2 #定義并引用mediapipe中的hands模塊 mpHands = mp.solutions.hands hands = mpHands.Hands() mpDraw = mp.solutions.drawing_utils #幀率時間計算 pTime = 0 cTime = 0 while True : success, img = cap.read() imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #cv2圖像初始化 results = hands.process(imgRGB) # print(results.multi_hand_landmarks) if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id , lm in enumerate (handLms.landmark): # print(id, lm) h, w, c = img.shape cx, cy = int (lm.x * w), int (lm.y * h) print ( id , cx, cy) # if id == 4: cv2.circle(img, (cx, cy), 15 , ( 255 , 0 , 255 ), cv2.FILLED) #繪制手部特征點: mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS) ''''' 視頻FPS計算 ''' cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, str ( int (fps)), ( 10 , 70 ), cv2.FONT_HERSHEY_PLAIN, 3 , ( 255 , 0 , 255 ), 3 ) #FPS的字號,顏色等設置 cv2.imshow( "HandsImage" , img) #CV2窗體 cv2.waitKey( 1 ) #關閉窗體 |
以此篇文章技術為基礎,后續會更新利用此篇基礎技術實現的《手勢控制:音量,鼠標》
項目下載地址https://github.com/BIGBOSS-dedsec/HandsDetection_Python
到此這篇關于Python+OpenCV手勢檢測與識別Mediapipe基礎篇的文章就介紹到這了
2022-12-10
vscode配置與python虛擬環境切換的幾種方式總結2022-12-10
python自動化測試中裝飾器@ddt與@data源碼深入解析2022-12-10
如何用python獲取到照片拍攝時的詳細位置(附源碼)方法一:速度快,截取單張時間大概零點幾秒。但是程序很長。如圖:紅框內的是獲得當前監視器設備的全屏尺寸。也可以可以不要,可以直接給w,h賦值,指定寬度和高度。紅框上面的是獲得設...
2022-12-06