基于Mediapipe+Opencv實(shí)現(xiàn)手勢(shì)檢測(cè)功能
一、前言
基于Mediapipe+Opencv實(shí)現(xiàn)手勢(shì)檢測(cè),想實(shí)現(xiàn)一下姿態(tài)識(shí)別的時(shí)候,感覺(jué)手勢(shì)識(shí)別也蠻重要的就過(guò)來(lái)順便實(shí)現(xiàn)一下。
下面是一些國(guó)內(nèi)的pip源,有需要可自取
阿里云 http://mirrors.aliyun.com/pypi/simple/
中國(guó)科技大學(xué) https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清華大學(xué) https://pypi.tuna.tsinghua.edu.cn/simple/
中國(guó)科學(xué)技術(shù)大學(xué) http://pypi.mirrors.ustc.edu.cn/simple/
二、環(huán)境配置
軟件:
ANACONDA3+Pycharm2019
環(huán)境:
- opencv-python>=4.5.5
- mediapipe>=0.8.9.1
注:一定關(guān)掉科學(xué)上網(wǎng)
三、全部源碼
比較短小且只有一個(gè)源文件MediapipeHandTracking.py我就直接在這里貼了
MediapipeHandTracking.py程序結(jié)構(gòu):
- 第一步:保存mediapipe中的手勢(shì)識(shí)別解決方案到mpHands,hands,mpDraw中
- 第二步:參數(shù)設(shè)定
- 第三步:循環(huán)讀取視頻流到img,img輸入hands.hands函數(shù)得到結(jié)果,繪制結(jié)果到img并輸出
MediapipeHandTracking.py源碼與注釋
import cv2 import mediapipe as mp import time #第一步:保存mediapipe中的手勢(shì)識(shí)別解決方案到mpHands,hands,mpDraw中 mpHands = mp.solutions.hands #以下三個(gè)是mediapipe 中的API調(diào)用模板了 hands = mpHands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5)#最小檢測(cè)置信度,最小追蹤置信度 mpDraw = mp.solutions.drawing_utils #獲取mediapipe解決方案的繪畫(huà)工具包 #第二步:參數(shù)設(shè)定 handLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=3)#繪制手部關(guān)鍵點(diǎn)的顏色與粗細(xì) handConStyle = mpDraw.DrawingSpec(color=(0, 255, 0), thickness=5)#繪制手部線(xiàn)條的顏色與粗細(xì) pTime = 0 #和下面的cTime一起用于計(jì)算視頻輸入流FPS cTime = 0 cap = cv2.VideoCapture(0) #打開(kāi)編號(hào)為0的攝像頭,這個(gè)一般是自帶攝像頭 #第三步:循環(huán)讀取視頻流到img,img輸入hands.hands函數(shù)得到結(jié)果,繪制結(jié)果到img并輸出 while True: ret, img = cap.read() #從cap中讀取圖片到img,并將讀取是否成功的結(jié)果保存在ret if ret: imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #模型訓(xùn)練的時(shí)候是使用RGB訓(xùn)練,對(duì)于這個(gè)類(lèi)型識(shí)別精度和速度比較高 result = hands.process(imgRGB) #將RGB圖片輸入手部模型將結(jié)果保存在result # print(result.multi_hand_landmarks) #打印result.multi_hand_landmarks內(nèi)容,可以去掉試一下 imgHeight = img.shape[0] #獲取攝像機(jī)圖片的高 imgWidth = img.shape[1] #獲取攝像機(jī)圖片的寬 if result.multi_hand_landmarks:#如果multi_hand_landmarks不為空進(jìn)入循環(huán) for handLms in result.multi_hand_landmarks: #遍歷multi_hand_landmarks內(nèi)每一個(gè)hand_landmark(手部關(guān)鍵點(diǎn)),相對(duì)于遍歷圖片中每一個(gè)手 mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle) #調(diào)用mediapipe內(nèi)繪畫(huà)工具包繪畫(huà)手部關(guān)鍵點(diǎn) for i, lm in enumerate(handLms.landmark): #i保存第幾個(gè)手部關(guān)鍵點(diǎn),lm保存該點(diǎn)在圖中的歸一化值 xPos = int(lm.x * imgWidth) #第i個(gè)關(guān)鍵點(diǎn)x yPos = int(lm.y * imgHeight)#第i個(gè)關(guān)鍵點(diǎn)y cv2.putText(img, str(i), (xPos-25, yPos+5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)#繪制關(guān)鍵點(diǎn)在,關(guān)鍵點(diǎn)左邊靠下一點(diǎn) if i == 8:#當(dāng)畫(huà)到第八個(gè)關(guān)鍵點(diǎn)時(shí) cv2.circle(img, (xPos, yPos), 10, (166, 0, 0), cv2.FILLED)#畫(huà)一個(gè)圓 #print(i, xPos, yPos) #打印繪制這個(gè)點(diǎn)時(shí)候的坐標(biāo) 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'):#點(diǎn)擊視頻,輸入q退出 break
四、環(huán)境配置
1、在Anaconda3上新建環(huán)境Gesture
打開(kāi)Anaconda Prompt,輸入:
conda create -n Gesture python=3.8
2、激活Gesture環(huán)境并下載opencv-python包
激活環(huán)境: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、打開(kāi)Pycharm完成環(huán)境導(dǎo)入項(xiàng)目
配置代碼運(yùn)行環(huán)境
五、運(yùn)行程序:
用Pycharm打開(kāi)包含hanTracking.py程序的文件夾,并運(yùn)行
運(yùn)行結(jié)果
六、程序應(yīng)用擴(kuò)展
1、手部的關(guān)鍵點(diǎn)的位置和次序我們?nèi)恳阎奶攸c(diǎn)
該功能可用于圖片ROI提取截取出圖片,然后進(jìn)行其他一些圖片操作。
該功能可用于手勢(shì)響應(yīng)事件。比如約定,食指和大拇指也就是4號(hào)和8號(hào)觸碰時(shí)候觸發(fā)某事件
,等等。
實(shí)現(xiàn)AL+操作
2、和其他AL結(jié)合
比如姿態(tài)檢測(cè)AL,能將人識(shí)別成一個(gè)火柴人,開(kāi)發(fā)空間有不少用處。
3、全身檢測(cè)源碼
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)#繪制手部關(guān)鍵點(diǎn)的顏色與粗細(xì) handConStyle = mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=4)#繪制手部線(xiàn)條的顏色與粗細(xì) 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()
運(yùn)行效果如下:
曬曬我?guī)洑獾纳嵊?/p>
到此這篇關(guān)于基于Mediapipe+Opencv實(shí)現(xiàn)手勢(shì)檢測(cè)的文章就介紹到這了,更多相關(guān)Opencv手勢(shì)檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)隨機(jī)梯度下降法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)梯度下降法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08使用Python和Scribus創(chuàng)建一個(gè)RGB立方體的方法
這篇文章主要介紹了使用Python和Scribus創(chuàng)建一個(gè)RGB立方體的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python忽略警告(warning)的3種方法小結(jié)
python開(kāi)發(fā)中經(jīng)常遇到報(bào)錯(cuò)的情況,但是warning通常并不影響程序的運(yùn)行,而且有時(shí)特別討厭,下面我們來(lái)說(shuō)下如何忽略warning錯(cuò)誤,這篇文章主要給大家介紹了關(guān)于python忽略警告(warning)的3種方法,需要的朋友可以參考下2023-10-10python 申請(qǐng)內(nèi)存空間,用于創(chuàng)建多維數(shù)組的實(shí)例
今天小編就為大家分享一篇python 申請(qǐng)內(nèi)存空間,用于創(chuàng)建多維數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-1268行Python代碼實(shí)現(xiàn)帶難度升級(jí)的貪吃蛇
本文主要介紹了Python代碼實(shí)現(xiàn)帶難度升級(jí)的貪吃蛇,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01python中matplotlib調(diào)整圖例位置的方法實(shí)例
在matplotlib中,一般圖例默認(rèn)是在圖表內(nèi)部的,如果要放置到圖例外面,需要對(duì)坐標(biāo)進(jìn)行指定,下面這篇文章主要給大家介紹了關(guān)于python中matplotlib調(diào)整圖例位置的相關(guān)資料,需要的朋友可以參考下2022-06-06Python實(shí)戰(zhàn)之能監(jiān)控文件變化的神器—看門(mén)狗
這篇文章主要介紹了Python實(shí)戰(zhàn)之能監(jiān)控文件變化的神器—看門(mén)狗,文中有非常詳細(xì)的圖文及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05selenium+python自動(dòng)化測(cè)試之鼠標(biāo)和鍵盤(pán)事件
這篇文章主要介紹了selenium+python自動(dòng)化測(cè)試之鼠標(biāo)和鍵盤(pán)事件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python 通過(guò)SMSActivateAPI 獲取驗(yàn)證碼的步驟
這篇文章主要介紹了python 通過(guò)SMSActivateAPI 如何獲取驗(yàn)證碼,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05