一文了解如何使用Python+OpenCV構(gòu)建手部跟蹤系統(tǒng)
OpenCV 是一個(gè)用于計(jì)算機(jī)視覺(jué)應(yīng)用程序的庫(kù)。在 OpenCV 的幫助下,我們可以構(gòu)建大量實(shí)時(shí)運(yùn)行更好的應(yīng)用程序。主要用于圖像和視頻處理?梢栽诖颂帿@取有關(guān) OpenCV 的更多信息
除了 OpenCV,我們將使用 MediaPipe 庫(kù)。MediaPipeMediaPipe是一個(gè)主要用于構(gòu)建音頻、視頻或任何時(shí)間序列數(shù)據(jù)的框架。在 MediaPipe 框架的幫助下,我們可以為不同的媒體處理功能構(gòu)建管道。MediaPipe 的一些主要應(yīng)用。多手追蹤人臉檢測(cè)對(duì)象檢測(cè)和跟蹤Objection:3D 對(duì)象檢測(cè)和跟蹤AutoFlip:自動(dòng)視頻裁剪管道等。
手地標(biāo)模型
MediaPipe 使用單次手掌檢測(cè)模型,一旦完成,它會(huì)對(duì)檢測(cè)到的手部區(qū)域中的 21 個(gè) 3D 手掌坐標(biāo)執(zhí)行精確的關(guān)鍵點(diǎn)定位。MediaPipe 管道使用多個(gè)模型,例如,從完整圖像返回定向手邊界框的手掌檢測(cè)模型。裁剪后的圖像區(qū)域被饋送到由手掌檢測(cè)器定義的手部標(biāo)志模型,并返回高保真 3D 手部關(guān)鍵點(diǎn),F(xiàn)在讓我們實(shí)現(xiàn)手部跟蹤模型。安裝所需的模塊–> pip install opencv-python–> pip install mediapipe首先,讓我們檢查網(wǎng)絡(luò)攝像頭的工作情況。import cv2
import time
cap = cv2.VideoCapture(0)
pTime = 0
while True:
success, img = cap.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, f'FPS:{int(fps)}', (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Test", img)
cv2.waitKey(1)
如果任何網(wǎng)絡(luò)攝像頭連接到你的 PC,上面的代碼將彈出一個(gè)窗口,并在輸出窗口的左上角顯示每秒幀數(shù) (fps),F(xiàn)在讓我們開始實(shí)施。導(dǎo)入所需的模塊并初始化所需的變量。import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands(static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0
在上面這段代碼中,我們?cè)趍p.solutions.hand 中聲明了一個(gè)名為“hands”的對(duì)象來(lái)檢測(cè)手部,默認(rèn)情況下,查看類“ Hands() ”內(nèi)部,要檢測(cè)的手部數(shù)量設(shè)置為2、最小檢測(cè)置信度設(shè)置為0.5,最小跟蹤置信度設(shè)置為0.5。我們將使用mpDraw繪制關(guān)鍵點(diǎn),F(xiàn)在讓我們編寫一個(gè) while 循環(huán)來(lái)執(zhí)行我們的代碼。while True:
success, img = cap.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
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)
#if id ==0:
cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
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)
cv2.imshow("Image", img)
cv2.waitKey(1)
在上面的代碼中,我們從網(wǎng)絡(luò)攝像頭讀取幀并將圖像轉(zhuǎn)換為 RGB。然后我們?cè)凇?hands.process()” 函數(shù)的幫助下檢測(cè)幀中的手。一旦檢測(cè)到手,我們將找到關(guān)鍵點(diǎn),然后使用cv2.circle突出顯示關(guān)鍵點(diǎn)中的點(diǎn),并使用mpDraw.draw_landmarks連接關(guān)鍵點(diǎn)。整個(gè)代碼如下import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands(static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0
while True:
success, img = cap.read()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
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)
#if id ==0:
cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
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)
cv2.imshow("Image", img)
cv2.waitKey(1)
輸出是:
手部追蹤模型輸出現(xiàn)在讓我們創(chuàng)建一個(gè)手部跟蹤模塊,以便我們可以在其他項(xiàng)目中使用它。創(chuàng)建一個(gè)新的 python 文件,首先讓我們創(chuàng)建一個(gè)名為handDetector的類,其中有兩個(gè)成員函數(shù),名為findHands 和findPosition。函數(shù)findHands將接受一個(gè) RGB 圖像并檢測(cè)幀中的手并定位關(guān)鍵點(diǎn),繪制地標(biāo),函數(shù)findPosition 將給出手的位置和 id。然后是我們初始化模塊的 main 函數(shù),我們還編寫了一個(gè) while 循環(huán)來(lái)運(yùn)行模型。你可以在此處將此設(shè)置或模塊導(dǎo)入到任何其他相關(guān)項(xiàng)目作品中。整個(gè)代碼如下import cv2
import mediapipe as mp
import time
class handDetector():
def __init__(self, mode = False, maxHands = 2, detectionCon = 0.5, trackCon = 0.5):
self.mode = mode
self.maxHands = maxHands
self.detectionCon = detectionCon
self.trackCon = trackCon
self.mpHands = mp.solutions.hands
self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.detectionCon, self.trackCon)
self.mpDraw = mp.solutions.drawing_utils
def findHands(self,img, draw = True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.hands.process(imgRGB)
# print(results.multi_hand_landmarks)
if self.results.multi_hand_landmarks:
for handLms in self.results.multi_hand_landmarks:
if draw:
self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)
return img
def findPosition(self, img, handNo = 0, draw = True):
lmlist = []
if self.results.multi_hand_landmarks:
myHand = self.results.multi_hand_landmarks[handNo]
for id, lm in enumerate(myHand.landmark):
h, w, c = img.shape
cx, cy = int(lm.x * w), int(lm.y * h)
lmlist.a(chǎn)ppend([id, cx, cy])
if draw:
cv2.circle(img, (cx, cy), 3, (255, 0, 255), cv2.FILLED)
return lmlist
def main():
pTime = 0
cTime = 0
cap = cv2.VideoCapture(0)
detector = handDetector()
while True:
success, img = cap.read()
img = detector.findHands(img)
lmlist = detector.findPosition(img)
if len(lmlist) != 0:
print(lmlist[4])
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)
cv2.imshow("Image", img)
cv2.waitKey(1)
if __name__ == "__main__":
main()
輸出將與上面顯示的相同,以及被跟蹤的手的位置。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒(méi)有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市