Python+OpenCV手勢檢測與識別Mediapipe基礎(chǔ)篇
前言
本篇文章適合剛?cè)腴TOpenCV的同學(xué)們。文章將介紹如何使用Python利用OpenCV圖像捕捉,配合強大的Mediapipe庫來實現(xiàn)手勢檢測與識別;本系列后續(xù)還會繼續(xù)更新Mediapipe手勢的各種衍生項目,還請多多關(guān)注!
項目效果圖
視頻捕捉幀數(shù)穩(wěn)定在(25-30)

認(rèn)識Mediapipe
項目的實現(xiàn),核心是強大的Mediapipe ,它是google的一個開源項目:
| 功能 | 詳細(xì) |
|---|---|
| 人臉檢測 FaceMesh | 從圖像/視頻中重建出人臉的3D Mesh |
| 人像分離 | 從圖像/視頻中把人分離出來 |
| 手勢跟蹤 | 21個關(guān)鍵點的3D坐標(biāo) |
| 人體3D識別 | 33個關(guān)鍵點的3D坐標(biāo) |
| 物體顏色識別 | 可以把頭發(fā)檢測出來,并圖上顏色 |
Mediapipe Dev:https://mediapipe.dev/

以上是Mediapipe的幾個常用功能 ,這幾個功能我們會在后續(xù)一一講解實現(xiàn)
Python安裝Mediapipe
pip install mediapipe==0.8.9.1
也可以用 setup.py 安裝
https://github.com/google/mediapipe
項目環(huán)境
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攝像頭捕捉部分:
import cv2
cap = cv2.VideoCapture(0) #OpenCV攝像頭調(diào)用:0=內(nèi)置攝像頭(筆記本) 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) #關(guān)閉窗體
mediapipe 手勢識別與繪制
#定義并引用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)
視頻幀率計算
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的字號,顏色等設(shè)置
完整代碼
# 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攝像頭調(diào)用:0=內(nèi)置攝像頭(筆記本) 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的字號,顏色等設(shè)置
cv2.imshow("HandsImage", img) #CV2窗體
cv2.waitKey(1) #關(guān)閉窗體
項目輸出

結(jié)語
以此篇文章技術(shù)為基礎(chǔ),后續(xù)會更新利用此篇基礎(chǔ)技術(shù)實現(xiàn)的《手勢控制:音量,鼠標(biāo)》
項目下載地址https://github.com/BIGBOSS-dedsec/HandsDetection_Python
到此這篇關(guān)于Python+OpenCV手勢檢測與識別Mediapipe基礎(chǔ)篇的文章就介紹到這了,更多相關(guān)Python OpenCV手勢識別Mediapipe內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python綜合應(yīng)用名片管理系統(tǒng)案例詳解
這篇文章主要介紹了Python綜合應(yīng)用名片管理系統(tǒng),結(jié)合具體案例形式詳細(xì)分析了Python名片管理系統(tǒng)相關(guān)步驟、原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2020-01-01
利用python繪制數(shù)據(jù)曲線圖的實現(xiàn)
這篇文章主要介紹了利用python繪制數(shù)據(jù)曲線圖的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

