import mediapipe as mpimport cv2import timegestures = None rock paper scissorsgestures_text = Rock Paper Scissorsuser_gesture = Nonecomputer_gesture = Nonecap = cv2VideoCapture0mpHands = mpsolutionsha
根据代码,在 get_gesture 函数中缺少了 self 参数,可以将其删除,修改为:
def get_gesture(Lms): # 获取手指的位置 p0_x = Lms.landmark[0].x p0_y = Lms.landmark[0].y
p5_x = Lms.landmark[5].x
p5_y = Lms.landmark[5].y
p8_x = Lms.landmark[8].x
p8_y = Lms.landmark[8].y
p9_x = Lms.landmark[9].x
p9_y = Lms.landmark[9].y
p12_x = Lms.landmark[12].x
p12_y = Lms.landmark[12].y
p13_x = Lms.landmark[13].x
p13_y = Lms.landmark[13].y
p16_x = Lms.landmark[16].x
p16_y = Lms.landmark[16].y
p17_x = Lms.landmark[17].x
p17_y = Lms.landmark[17].y
p20_x = Lms.landmark[20].x
p20_y = Lms.landmark[20].y
# 通过两点距离公式,计算出两个点之间的距离
distance_0_5 = ((p0_x - p5_x) ** 2 + (p0_y - p5_y) ** 2) ** 0.5
distance_0_8 = ((p0_x - p8_x) ** 2 + (p0_y - p8_y) ** 2) ** 0.5
distance_0_9 = ((p0_x - p9_x) ** 2 + (p0_y - p9_y) ** 2) ** 0.5
distance_0_12 = ((p0_x - p12_x) ** 2 + (p0_y - p12_y) ** 2) ** 0.5
distance_0_13 = ((p0_x - p13_x) ** 2 + (p0_y - p13_y) ** 2) ** 0.5
distance_0_16 = ((p0_x - p16_x) ** 2 + (p0_y - p16_y) ** 2) ** 0.5
distance_0_17 = ((p0_x - p17_x) ** 2 + (p0_y - p17_y) ** 2) ** 0.5
distance_0_20 = ((p0_x - p20_x) ** 2 + (p0_y - p20_y) ** 2) ** 0.5
# 通过距离并不能准确地判断手指是否屈伸,因为手可以前后移动,在屏幕中手的大小会改变
# 所以通过从手的0点到手指的距离与食指与手掌的距离的比值进行判断,这样就可根据一个固定值来判断时候手指屈伸
# 食指
base_1 = distance_0_5 / 0.8
# 中指
base_2 = distance_0_9 / 0.8
# 无名指
base_3 = distance_0_13 / 0.8
# 小指
base_4 = distance_0_17 / 0.8
if distance_0_8 > base_1 and distance_0_12 > base_2:
if distance_0_16 > base_3 and distance_0_20 > base_4:
user_gesture = 2
elif distance_0_16 < base_3 and distance_0_20 < base_4:
user_gesture = 3
else:
user_gesture = 0
elif distance_0_8 < base_1 and distance_0_12 < base_2:
if distance_0_16 < base_3 and distance_0_20 < base_4:
user_gesture = 1
else:
user_gesture = 0
else:
user_gesture = 0
return user_gestur
原文地址: https://www.cveoy.top/t/topic/fMTP 著作权归作者所有。请勿转载和采集!