基於Mediapipe+Opencv實現手勢檢測功能
一、前言
基於Mediapipe+Opencv實現手勢檢測,想實現一下姿態識別的時候,感覺手勢識別也蠻重要的就過來順便實現一下。
下面是一些國內的pip源,有需要可自取
阿裡雲 http://mirrors.aliyun.com/pypi/simple/
中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple/
中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple/
二、環境配置
軟件:
ANACONDA3+Pycharm2019
環境:
- opencv-python>=4.5.5
- mediapipe>=0.8.9.1
註:一定關掉科學上網
三、全部源碼
比較短小且隻有一個源文件MediapipeHandTracking.py我就直接在這裡貼瞭
MediapipeHandTracking.py程序結構:
- 第一步:保存mediapipe中的手勢識別解決方案到mpHands,hands,mpDraw中
- 第二步:參數設定
- 第三步:循環讀取視頻流到img,img輸入hands.hands函數得到結果,繪制結果到img並輸出
MediapipeHandTracking.py源碼與註釋
import cv2 import mediapipe as mp import time #第一步:保存mediapipe中的手勢識別解決方案到mpHands,hands,mpDraw中 mpHands = mp.solutions.hands #以下三個是mediapipe 中的API調用模板瞭 hands = mpHands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5)#最小檢測置信度,最小追蹤置信度 mpDraw = mp.solutions.drawing_utils #獲取mediapipe解決方案的繪畫工具包 #第二步:參數設定 handLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=3)#繪制手部關鍵點的顏色與粗細 handConStyle = mpDraw.DrawingSpec(color=(0, 255, 0), thickness=5)#繪制手部線條的顏色與粗細 pTime = 0 #和下面的cTime一起用於計算視頻輸入流FPS cTime = 0 cap = cv2.VideoCapture(0) #打開編號為0的攝像頭,這個一般是自帶攝像頭 #第三步:循環讀取視頻流到img,img輸入hands.hands函數得到結果,繪制結果到img並輸出 while True: ret, img = cap.read() #從cap中讀取圖片到img,並將讀取是否成功的結果保存在ret if ret: imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #模型訓練的時候是使用RGB訓練,對於這個類型識別精度和速度比較高 result = hands.process(imgRGB) #將RGB圖片輸入手部模型將結果保存在result # print(result.multi_hand_landmarks) #打印result.multi_hand_landmarks內容,可以去掉試一下 imgHeight = img.shape[0] #獲取攝像機圖片的高 imgWidth = img.shape[1] #獲取攝像機圖片的寬 if result.multi_hand_landmarks:#如果multi_hand_landmarks不為空進入循環 for handLms in result.multi_hand_landmarks: #遍歷multi_hand_landmarks內每一個hand_landmark(手部關鍵點),相對於遍歷圖片中每一個手 mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle) #調用mediapipe內繪畫工具包繪畫手部關鍵點 for i, lm in enumerate(handLms.landmark): #i保存第幾個手部關鍵點,lm保存該點在圖中的歸一化值 xPos = int(lm.x * imgWidth) #第i個關鍵點x yPos = int(lm.y * imgHeight)#第i個關鍵點y cv2.putText(img, str(i), (xPos-25, yPos+5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)#繪制關鍵點在,關鍵點左邊靠下一點 if i == 8:#當畫到第八個關鍵點時 cv2.circle(img, (xPos, yPos), 10, (166, 0, 0), cv2.FILLED)#畫一個圓 #print(i, xPos, yPos) #打印繪制這個點時候的坐標 cTime = time.time() fps = 1/(cTime-pTime) pTime = cTime cv2.putText(img, f"FPS : {int(fps)}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3) #繪制FSP到圖中 cv2.imshow('img', img) #輸出圖片 if cv2.waitKey(1) == ord('q'):#點擊視頻,輸入q退出 break
四、環境配置
1、在Anaconda3上新建環境Gesture
打開Anaconda Prompt,輸入:
conda create -n Gesture python=3.8
2、激活Gesture環境並下載opencv-python包
激活環境:conda activate Gesture
下載opencv-python包:pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/
3、下載mediapipe包
pip install mediapipe -i https://pypi.tuna.tsinghua.edu.cn/simple/
4、打開Pycharm完成環境導入項目
配置代碼運行環境
五、運行程序:
用Pycharm打開包含hanTracking.py程序的文件夾,並運行
運行結果
六、程序應用擴展
1、手部的關鍵點的位置和次序我們全部已知的特點
該功能可用於圖片ROI提取截取出圖片,然後進行其他一些圖片操作。
該功能可用於手勢響應事件。比如約定,食指和大拇指也就是4號和8號觸碰時候觸發某事件
,等等。
實現AL+操作
2、和其他AL結合
比如姿態檢測AL,能將人識別成一個火柴人,開發空間有不少用處。
3、全身檢測源碼
import cv2 import time import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_holistic = mp.solutions.holistic holistic = mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) handLmsStyle = mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=0)#繪制手部關鍵點的顏色與粗細 handConStyle = mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=4)#繪制手部線條的顏色與粗細 cap = cv2.VideoCapture(0) while True: ret,image=cap.read() if ret: image = cv2.flip(image, 1) image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB) results = holistic.process(image) if results.pose_landmarks: mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_CONTOURS,handLmsStyle,handConStyle) mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS) mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS) mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS) cv2.imshow("img",image) if cv2.waitKey(1)==ord("q"): break holistic.close()
運行效果如下:
曬曬我帥氣的舍友
到此這篇關於基於Mediapipe+Opencv實現手勢檢測的文章就介紹到這瞭,更多相關Opencv手勢檢測內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python+OpenCV手勢檢測與識別Mediapipe基礎篇
- python+mediapipe+opencv實現手部關鍵點檢測功能(手勢識別)
- OpenCV+MediaPipe實現手部關鍵點識別
- Python+OpenCV實戰之拖拽虛擬方塊的實現
- Python如何使用opencv進行手勢識別詳解