計算機視覺之手勢、面部、姿勢捕捉以 Python Mediapipe為工具
文章目錄
- 1.`Mediapipe`庫概述
- 2.手勢捕捉(`hands`)
- 3.面部捕捉(`face`)
- 4.姿勢捕捉(`pose`)
1.Mediapipe
庫概述
Mediapipe
是一個開源且強大的Python庫,由Google開發和維護。它提供了豐富的工具和功能,用于處理實時多媒體數據。它可以幫助開發者快速構建各種視覺和音頻處理應用,并允許他們靈活地定制和擴展庫的功能。
Mediapipe庫的主要功能包括:
- 視覺處理:Mediapipe可以進行人臉檢測、姿勢估計、手部跟蹤等。它通過使用預訓練的模型和算法來分析圖像或視頻,并提供相應的結果。這使得開發者能夠輕松地實現各種視覺處理任務。
- 音頻處理:Mediapipe還可以進行音頻信號的處理,例如語音識別、音頻增強、語音轉換等。它提供了一些內置的音頻處理模塊,開發者可以使用這些模塊來快速構建自己的音頻處理流水線。
- 數據流處理:Mediapipe庫還提供了一套用于處理數據流的工具。開發者可以使用這些工具來構建復雜的數據處理流程,包括數據的輸入、輸出、轉換和合并等。這使得開發者能夠更方便地處理實時多媒體數據流。
本期博客,作者將分享使用Mediapipe
庫實現手勢、面部、動作識別的方法。
????
2.手勢捕捉(hands
)
該段代碼使用OpenCV
和MediaPipe
庫來檢測攝像頭視頻中的手部,并在圖像上繪制關鍵點和連接線。
import cv2
import time
import mediapipe as mpcapture = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0while (capture.isOpened()):retval, img = capture.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = hands.process(imgRGB)if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:for id, lm in enumerate(handLms.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:"+str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 2,(0, 0, 255), 2)cv2.imshow("Video", img) key = cv2.waitKey(1)if key == 32:breakcapture.release()
cv2.destroyAllWindows()
效果展示:
??????
關于代碼,具體解釋如下:
-
導入所需的庫:
- cv2:用于處理圖像和視頻的
OpenCV
庫。 - time:用于計算幀率的
Python
標準庫。 - mediapipe as mp:
MediaPipe
庫,用于手部檢測和姿態估計。
- cv2:用于處理圖像和視頻的
-
創建視頻捕獲對象:
- 使用
cv2.VideoCapture(0)
創建一個視頻捕獲對象,參數0表示使用默認攝像頭。
- 使用
-
初始化MediaPipe手部檢測器:
- 使用
mp.solutions.hands.Hands()
創建一個手部檢測器對象。 hands.process(imgRGB)
將每個視頻幀傳遞給檢測器進行處理,并返回檢測結果。
- 使用
-
處理每個視頻幀:
- 使用
capture.read()
讀取視頻幀,并將返回的結果存儲在retval
和img
變量中。 - 使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
將圖像從BGR格式轉換為RGB格式,以便與MediaPipe兼容。 - 使用
hands.process(imgRGB)
對圖像進行手部檢測,返回結果保存在results
變量中。
- 使用
-
繪制檢測結果:
- 使用
results.multi_hand_landmarks
判斷是否檢測到了手部。 - 對于每個檢測到的手部,使用
handLms.landmark
遍歷所有關鍵點,并將其坐標從歸一化坐標轉換為圖像上的實際坐標。 - 使用
cv2.circle()
在圖像中繪制關鍵點圓圈。 - 使用
mpDraw.draw_landmarks()
在圖像中繪制手部關鍵點和連接線。
- 使用
-
計算幀率:
- 使用
time.time()
獲取當前時間戳,計算時間間隔以確定幀率。 - 使用
cv2.putText()
在圖像上顯示幀率。
- 使用
-
顯示圖像并等待按鍵:
- 使用
cv2.imshow()
顯示處理后的圖像。 - 使用
cv2.waitKey(1)
等待用戶按鍵,參數1表示等待1毫秒。
- 使用
-
釋放資源:
- 在循環結束后,使用
capture.release()
釋放視頻捕獲對象。 - 使用
cv2.destroyAllWindows()
關閉所有窗口。
- 在循環結束后,使用
-
退出程序:
- 按下空格鍵(32)可以退出程序。
3.面部捕捉(face
)
該段代碼使用OpenCV和MediaPipe庫來檢測攝像頭視頻中的人臉,并在圖像上繪制人臉關鍵點和輪廓。
import cv2
import time
import mediapipe as mpcapture = cv2.VideoCapture(0)mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh()
mpDraw = mp.solutions.drawing_utilspTime = 0 # 上一幀的時間
cTime = 0 # 下一幀的時間while (capture.isOpened()):retval, img = capture.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = faceMesh.process(imgRGB)if results.multi_face_landmarks:for faceLms in results.multi_face_landmarks:for id, lm in enumerate(faceLms.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)# cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)cv2.imshow("Video", img)key = cv2.waitKey(1)if key == 32:breakcapture.release()
cv2.destroyAllWindows()
以電影情節畫面替代攝像頭畫面,代碼效果展示如下:
以下是代碼的解釋:
-
導入所需的庫:
- cv2:用于處理圖像和視頻的OpenCV庫。
- time:用于計算幀率的標準Python庫。
- mediapipe as mp:MediaPipe庫,用于人臉檢測和特征點估計。
-
創建視頻捕獲對象:
- 使用
cv2.VideoCapture(0)
創建一個視頻捕獲對象,參數0表示使用默認攝像頭。
- 使用
-
初始化MediaPipe人臉檢測器:
- 使用
mp.solutions.face_mesh.FaceMesh()
創建一個人臉檢測器對象。 faceMesh.process(imgRGB)
將每個視頻幀傳遞給檢測器進行處理,并返回檢測結果。
- 使用
-
處理每個視頻幀:
- 使用
capture.read()
讀取視頻幀,并將返回的結果存儲在retval
和img
變量中。 - 使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
將圖像從BGR格式轉換為RGB格式,以便與MediaPipe兼容。 - 使用
faceMesh.process(imgRGB)
對圖像進行人臉檢測,返回結果保存在results
變量中。
- 使用
-
繪制檢測結果:
- 使用
results.multi_face_landmarks
判斷是否檢測到了人臉。 - 對于每個檢測到的人臉,使用
faceLms.landmark
遍歷所有關鍵點,并將其坐標從歸一化坐標轉換為圖像上的實際坐標。 - 使用
mpDraw.draw_landmarks()
在圖像中繪制人臉關鍵點和輪廓。
- 使用
-
計算幀率:
- 使用
time.time()
獲取當前時間戳,計算時間間隔以確定幀率。 - 使用
cv2.putText()
在圖像上顯示幀率。
- 使用
-
顯示圖像并等待按鍵:
- 使用
cv2.imshow()
顯示處理后的圖像。 - 使用
cv2.waitKey(1)
等待用戶按鍵,參數1表示等待1毫秒。
- 使用
-
釋放資源:
- 在循環結束后,使用
capture.release()
釋放視頻捕獲對象。 - 使用
cv2.destroyAllWindows()
關閉所有窗口。
- 在循環結束后,使用
-
退出程序:
- 按下空格鍵(32)可以退出程序。
4.姿勢捕捉(pose
)
該段代碼使用OpenCV和MediaPipe庫來檢測攝像頭視頻中的人體姿勢,并在圖像上繪制關鍵點和連接線。
import cv2
import time
import mediapipe as mpvideo = cv2.VideoCapture(0)
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utilspTime = 0 # 上一幀的時間
cTime = 0 # 下一幀的時間while True:retval, img = video.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = pose.process(imgRGB)if results.pose_landmarks:for id, lm in enumerate(results.pose_landmarks.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)cv2.imshow("Video", img)key = cv2.waitKey(10)if key == 32:breakvideo.release()
cv2.destroyAllWindows()
效果展示:
????????
以下是代碼的解釋:
-
導入所需的庫:
- cv2:用于處理圖像和視頻的OpenCV庫。
- time:用于計算幀率的標準Python庫。
- mediapipe as mp:MediaPipe庫,用于人體姿勢檢測。
-
創建視頻捕獲對象:
- 使用
cv2.VideoCapture(0)
創建一個視頻捕獲對象,參數0表示使用默認攝像頭。
- 使用
-
初始化MediaPipe人體姿勢檢測器:
- 使用
mp.solutions.pose.Pose()
創建一個人體姿勢檢測器對象。 pose.process(imgRGB)
將每個視頻幀傳遞給檢測器進行處理,并返回檢測結果。
- 使用
-
處理每個視頻幀:
- 使用
video.read()
讀取視頻幀,并將返回的結果存儲在retval
和img
變量中。 - 使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
將圖像從BGR格式轉換為RGB格式,以便與MediaPipe兼容。 - 使用
pose.process(imgRGB)
對圖像進行人體姿勢檢測,返回結果保存在results
變量中。
- 使用
-
繪制檢測結果:
- 使用
results.pose_landmarks
判斷是否檢測到了人體姿勢。 - 對于每個檢測到的關鍵點,使用
landmark
遍歷所有關鍵點,并將其坐標從歸一化坐標轉換為圖像上的實際坐標。 - 使用
cv2.circle()
在圖像中繪制關鍵點圓圈。 - 使用
mpDraw.draw_landmarks()
在圖像中繪制人體姿勢關鍵點和連接線。
- 使用
-
計算幀率:
- 使用
time.time()
獲取當前時間戳,計算時間間隔以確定幀率。 - 使用
cv2.putText()
在圖像上顯示幀率。
- 使用
-
顯示圖像并等待按鍵:
- 使用
cv2.imshow()
顯示處理后的圖像。 - 使用
cv2.waitKey(10)
等待用戶按鍵,參數10表示等待10毫秒。
- 使用
-
釋放資源:
- 在循環結束后,使用
video.release()
釋放視頻捕獲對象。 - 使用
cv2.destroyAllWindows()
關閉所有窗口。
- 在循環結束后,使用
-
退出程序:
- 按下空格鍵(32)可以退出程序。
附:侯小啾Python基礎領航計劃專欄已上線,特價專欄只需9.9即可掃清入門路上一切障礙。
跟著小啾,入門無憂!無論是系統化學習,還是碎片化學習都是很好的選擇,點擊下方鏈接即可訂閱:
https://blog.csdn.net/weixin_48964486/category_12510091.html
更多精彩內容敬請期待,作者侯小啾持續為您推出!