環(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()