參數說明是農場文章,這個網站也是去別人那裡拷貝下來的
STATIC_IMAGE_MODE: 如果設置為false,則解決方案會將輸入圖像視為視頻流。它將嘗試在第一個輸入圖像中檢測手,並在成功檢測後進一步定位手的地標。在隨後的圖像中,一旦檢測到所有手並且定位了相應的手地標,它便會簡單地跟蹤這些地標,而無需調用另一次檢測,直到失去對任何手的跟蹤為止。這減少了等待時間,是處理視頻幀的理想選擇。如果設置為true,則手部檢測將在每個輸入圖像上運行,非常適合處理一批靜態的,可能不相關的圖像。默認為false。
MAX_NUM_HANDS: 要檢測的最大手數。默認為2。
MIN_DETECTION_CONFIDENCE: [0.0, 1.0]來自手部檢測模型的最小置信度值被認為是成功的檢測。默認為0.5。
MIN_TRACKING_CONFIDENCE: [0.0, 1.0]來自地標跟蹤模型的最小置信度值將被視為已成功跟蹤的手部地標,否則將在下一個輸入圖像上自動調用手部檢測。將其設置為更高的值可以提高解決方案的健壯性,但代價是更高的延遲。如果為true,則忽略操作,其中手檢測僅在每個圖像上運行。默認為0.5。
MULTI_HAND_LANDMARKS: 檢測/跟蹤的手,其中每個手被表示為21層的手的地標列表以及每個界標由收集x,y和z。x和y分別[0.0, 1.0]通過圖像的寬度和高度進行歸一化。z代表地標深度,以手腕處的深度為原點,值越小,地標越靠近相機。的z使用量級與大致相同x。 多手: 被檢測/被追蹤的手的手性的集合(即它是左手還是右手)。每隻手由label和組成score。label是"Left"或"Right"。score是預計左右手的估計機率,並且始終大於或等於0.5
import cv2
import mediapipe as mp
#匯入需要的函式庫
mp_drawing = mp.solutions.drawing_utils # mediapipe 繪圖方法
mp_drawing_styles = mp.solutions.drawing_styles # mediapipe 繪圖樣式
mp_hands = mp.solutions.hands # mediapipe 偵測手掌方法
hands = mp_hands.Hands(
model_complexity=0,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
cap = cv2.VideoCapture(0)#0代表抓取視訊鏡頭
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, img = cap.read()
if not ret:
print("Cannot receive frame")
break
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 將 BGR 轉換成 RGB
results = hands.process(img2) # 偵測手掌
"""
if results.multi_handedness:
for hand_label in results.multi_handedness:
print(hand_label)
"""
#這一段程式碼如果放進去就會顯示在黑白視窗中label跟score的數值,畫面數值一值在改變
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
# 將節點和骨架繪製到影像中
mp_drawing.draw_landmarks(
img,
hand_landmarks,
mp_hands.HAND_CONNECTIONS)
#如果要有顏色,mp_drawing.draw_landmarks()裡面最後要加上下面兩個參數,把hand_landmarks與hand_connections加上顏色
#mp_drawing_styles.get_default_hand_landmarks_style(),
#mp_drawing_styles.get_default_hand_connections_style())
cv2.imshow('21 point detection', img)
if cv2.waitKey(5) & 0xFF == 27: #按下ESC結束
break
# mediapipe 啟用偵測手掌
cap.release()
cv2.destroyAllWindows()#關閉所有視窗