Python MediaPipe 手势识别:石头剪刀布
import mediapipe as mp import cv2 import time
cap = cv2.VideoCapture(0) mpHance = mp.solutions.hands # 选择策略 -- 监测手的模型 mpDraw = mp.solutions.drawing_utils handLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=5) # 设定点的样式 颜色 粗细,半径 handConStyle = mpDraw.DrawingSpec(color=(0, 255, 2), thickness=10) # 设定线的样式 颜色 粗细,半径 pTime = 0 cTime = 0 hands = mpHance.Hands(static_image_mode=False, # 影片 false 图片 True max_num_hands=2, # 最大手识别数量 model_complexity=1, # 模型的复杂度 只能是 0 1 越高越准 min_detection_confidence=0.9, # 识别的精准度 min_tracking_confidence=0.5) # 追踪的严谨度
while True: ret, img = cap.read() # 读取到的图片都是bgr的图片 ,故需要将其转换为RGB的图片
if ret:
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
result = hands.process(imgRGB) # 侦测
# print(result.multi_hand_landmarks) 结果为 三个坐标 XYZ
imgHeight = img.shape[0] # 获取视窗的高度
imgWidth = img.shape[1] # 获取视窗的宽度
if result.multi_hand_landmarks:
for handLms in result.multi_hand_landmarks: # 画出所有点和线
mpDraw.draw_landmarks(img, handLms, mpHance.HAND_CONNECTIONS, handLmsStyle, handConStyle)
# 计算手指位置和角度
thumb = handLms.landmark[4]
index = handLms.landmark[8]
middle = handLms.landmark[12]
ring = handLms.landmark[16]
pinky = handLms.landmark[20]
# 判断手势
if thumb.y < index.y and middle.y < index.y and ring.y < index.y and pinky.y < index.y:
# 石头
cv2.putText(img, 'Rock', (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
elif thumb.y > index.y and thumb.y > middle.y and thumb.y > ring.y and thumb.y > pinky.y and index.y < middle.y:
# 剪刀
cv2.putText(img, 'Scissors', (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
elif thumb.y > index.y and middle.y > index.y and ring.y > index.y and pinky.y > index.y:
# 布
cv2.putText(img, 'Paper', (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, f'FPS : {int(fps)}', (20, 80), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cv2.imshow('img', img)
if cv2.waitKey(1) == ord('q'):
break
cap.release() cv2.destroyAllWindows()
在上述代码中,我们通过计算大拇指和其他手指的位置和角度来判断手势,并在屏幕上显示对应的文字。注意,这种方法并不是非常精确,而且对手势的识别还要考虑更多因素,例如手的旋转、手的大小和手的位置等。因此,在实际应用中,我们需要根据实际情况进行调整,以达到更好的识别效果。
原文地址: https://www.cveoy.top/t/topic/opXc 著作权归作者所有。请勿转载和采集!