python 檢測手指,虛擬挪動屏幕上的方塊

環(huán)境:
python3.8

描述:使用opencv讀取攝像頭幀數(shù)據(jù),使用mediapipe檢測手指坐標

個人學習記錄不喜勿噴
貼上代碼:

# 手勢拖拽方塊

import cv2
import numpy as np

# mediapipe 參數(shù)
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands

hands =  mp_hands.Hands(
   model_complexity=0,
   min_detection_confidence=0.5,
   min_tracking_confidence=0.5)


# 獲取攝像頭視頻流
cap = cv2.VideoCapture(0)
# 獲取畫面寬度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

#  方塊參數(shù)
square_x = 100
square_y = 100
square_width = 100

L1 = 0
L2 = 0
on_square = False

while True:
   # 讀取視頻幀數(shù)據(jù)
   ret,frame = cap.read()

   # 對圖像進行處理
   # 鏡像處理
   frame = cv2.flip(frame,1)

   # mediapip處理 
   frame.flags.writeable = False
   frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
   results = hands.process(frame)

     # Draw the hand annotations on the image.
   frame.flags.writeable = True
   frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

   # 解析results
   # 判斷是否出現(xiàn)雙手
   if results.multi_hand_landmarks:
     #解析每一雙手
     for hand_landmarks in results.multi_hand_landmarks:
       # 繪制21個關鍵點
       mp_drawing.draw_landmarks(
           frame,
           hand_landmarks,
           mp_hands.HAND_CONNECTIONS,
           mp_drawing_styles.get_default_hand_landmarks_style(),
           mp_drawing_styles.get_default_hand_connections_style())
       # print(hand_landmarks)
       x_list = []
       y_list = []
       for landmark in hand_landmarks.landmark:
          #添加x坐標
          x_list.append(landmark.x)
          #添加y坐標
          y_list.append(landmark.y)
       # 獲取食指指尖x y坐標
       index_finger_x = int(x_list[8]*width)
       index_finger_y = int(y_list[8]*height)
       # 畫一個圓驗證坐標
       # cv2.circle(frame,(index_finger_x,index_finger_y),30,(255,0,255),-1)

       # 判斷食指指尖在不在方塊上
       if (index_finger_x > square_x) and (index_finger_x < (square_x + square_width)) and (index_finger_y > square_y) and (index_finger_y < (square_y + square_width)):
           L1 = abs(index_finger_x - square_x)
           L2 = abs(index_finger_y - square_y)
           on_square = True

       if on_square:
           square_x = index_finger_x - L1
           square_y = index_finger_y - L2
   else:
      on_square = False
   # 畫一個方塊
   cv2.rectangle(frame,(square_x,square_y),(square_x+square_width,square_y+square_width),(255,0,0),-1)

   # 顯示
   cv2.imshow('virtual drag',frame)

   if cv2.waitKey(10)  & 0xFF == 27:
       break

cap.release()
cv2.destroyAllWindows()



?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內容

友情鏈接更多精彩內容