本文禁止轉載,如需轉載需征得本人同意,
目錄
- 前言
- 一、OpenCV及MediaPipe
- 二、實操步驟
- 1.下載
- 1.Pycharm的下載安裝
- 2.Opencv和MediaPipe的下載安裝
- 2.手勢追蹤的最小代碼實作
前言
第一次發表文章,如有錯誤,懇請讀者指正,
本文將拋棄繁雜的理論知識,直接上手專案,
文章大部分問題可以在以下幾個鏈接中解決:
https://www.liaoxuefeng.com/wiki/1016959663602400
(廖雪峰Python教程)
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html
(opencv簡單入門)
https://google.github.io/mediapipe/solutions/hands.html
(mediapipe參考)
一、OpenCV及MediaPipe
顧名思義,“Open”表示開放;“CV”即“Computer Vision”,是一款開源的跨平臺計算機視覺和機器學習軟體庫,MediaPipe是一款多媒體機器學習模型應用框架,
兩者主要的優點是不需要我們下載預訓練模型,只是安裝上其包即可,
二、實操步驟
1.下載
1.Pycharm的下載安裝
(需要提前安裝Python)下載地址:http://www.jetbrains.com/pycharm/download/#section=windows

選擇社區版即可,
(如未安裝,先安裝此軟體)Python官網下載:https://www.python.org/downloads/
按照軟體按照提示下載即可,
2.Opencv和MediaPipe的下載安裝
打開安裝好的pycharm
如圖依次點擊

此處搜索chinese安裝插件可將軟體部分替換成中文,
重啟IDE后即可生效,

新建專案,

此處我們將我們的第一個專案命名為hand
創建好專案后,安裝Opencv以及MediaPipe

左上角進入設定,

如圖依次點擊,


點擊安裝包,分別安裝好Opencv以及mediapipe
到此,安裝完畢,
2.手勢追蹤的最小代碼實作


新建Python檔案

命名為HandTrakingMin,回車確認,
檔案創建好了,我們來逐段撰寫代碼
import cv2
import mediapipe as mp
import time
import
python中的import陳述句是用來呼叫模塊的,在模塊定義好后,我們可以使用import陳述句來引入模塊,
import as
用于引入一個模塊的同時為該模塊取一個別名,
使用語法:import mediapipe as mp 表示引入mediapipe模塊并取別名為mp,在該檔案的后續呼叫中mp就相當于是mediapipe
接著
# 獲取視頻物件,0為攝像頭,也可以寫入視頻路徑
cap = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
# Hands是一個類,有四個初始化引數,static_image_mode,max_num_hands,min_detection_confidence,min_tracking_confidence
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils # 畫線函式
pTime = 0 # 開始時間初始化
cTime = 0 # 目前時間初始化
我們利用Opencv的cv2.VideoCapture()函式,獲取視頻物件,時間初始化為的是之后顯示幀數而提前準備,
while True:
# sucess是布爾型,讀取幀正確回傳True;img是每一幀的影像(BGR存盤格式)
success, img = cap.read()
# 將一幅影像從一個色彩空間轉換為另一個,回傳轉換后的色彩空間影像
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 處理RGB影像并回傳手的標志點和檢測到的每個手物件
results = hands.process(imgRGB)
# results.multi_hand_landmarks回傳None或手的標志點坐標
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
# landmark有21個(具體查閱上面的參考網址),id是索引,lm是x,y坐標
for id, lm in enumerate(handLms.landmark):
# print(id, lm) # lm的坐標是點在影像中的比例坐標
# h-height,w-weight影像的寬度和高度
h, w, c = img.shape
# 將landmark的比例坐標轉換為在影像像元上的坐標
cx, cy = int(lm.x * w), int(lm.y * h)
print(id, cx, cy)
# 將手的標志點個性化顯示
cv2.circle(img, (cx, cy), int(w / 50), (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), 1)
# 在Image視窗上顯示新繪制的影像img
cv2.imshow("Image", img)
# 這個函式是在一個給定的時間內(單位ms)等待用戶按鍵觸發;如果用戶按下鍵,則繼續執行后面的代碼,如果用戶沒有按下鍵,則接續等待
cv2.waitKey(1)
運行結果

看完有識訓可讀者可關注收藏評論
接下來的章節將更新如何模塊化我們的代碼,以及實作手勢控制音量
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282836.html
標籤:AI
上一篇:2021華東杯數學建模賽題思路
