1 Star 7 Fork 0

T-Maker JAY / opencv手势视觉识别

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
hands_gesture.py 5.15 KB
一键复制 编辑 原始数据 按行查看 历史
T-Maker JAY 提交于 2022-07-22 16:17 . add hands_gesture.py.
import mediapipe as mp
import cv2
import numpy as np
import serial
def get_angle(v1, v2):
angle = np.dot(v1, v2) / (np.sqrt(np.sum(v1 * v1)) * np.sqrt(np.sum(v2 * v2)))
angle = np.arccos(angle) / 3.14 * 180
return angle
# noinspection PyShadowingNames
def get_str_guester(up_fingers: object, list_lms: object) -> object:
if len(up_fingers) == 1 and up_fingers[0] == 8:
v1 = list_lms[6] - list_lms[7]
v2 = list_lms[8] - list_lms[7]
angle = get_angle(v1, v2)
if angle < 160:
str_guested = "9"
else:
str_guested = "1"
serial.write("1".encode()) #此代码用于发送数据给单片机
elif len(up_fingers) == 1 and up_fingers[0] == 4:
str_guested = "Good"
elif len(up_fingers) == 1 and up_fingers[0] == 20:
str_guested = "Bad"
elif len(up_fingers) == 1 and up_fingers[0] == 12:
str_guested = "FXXX"
elif len(up_fingers) == 2 and up_fingers[0] == 8 and up_fingers[1] == 12:
str_guested = "2"
serial.write("2".encode())
elif len(up_fingers) == 2 and up_fingers[0] == 4 and up_fingers[1] == 20:
str_guested = "6"
elif len(up_fingers) == 2 and up_fingers[0] == 4 and up_fingers[1] == 8:
str_guested = "8"
elif len(up_fingers) == 3 and up_fingers[0] == 8 and up_fingers[1] == 12 and up_fingers[2] == 16:
str_guested = "3"
serial.write("3".encode())
elif len(up_fingers) == 3 and up_fingers[0] == 4 and up_fingers[1] == 8 and up_fingers[2] == 12:
dis_8_12 = list_lms[8, :] - list_lms[12, :]
dis_8_12 = np.sqrt(np.dot(dis_8_12, dis_8_12))
dis_4_12 = list_lms[4, :] - list_lms[12, :]
dis_4_12 = np.sqrt(np.dot(dis_4_12, dis_4_12))
if dis_4_12 / (dis_8_12 + 1) < 3:
# noinspection PyShadowingNames
str_guested = "7"
elif dis_4_12 / (dis_8_12 + 1) > 5:
str_guested = "Gun"
else:
str_guested = "7"
elif len(up_fingers) == 3 and up_fingers[0] == 4 and up_fingers[1] == 8 and up_fingers[2] == 20:
str_guested = "ROCK"
elif len(up_fingers) == 4 and up_fingers[0] == 8 and up_fingers[1] == 12 and up_fingers[2] == 16 and up_fingers[
3] == 20:
str_guested = "4"
serial.write("4".encode())
elif len(up_fingers) == 5:
str_guested = "5"
serial.write("5".encode())
elif len(up_fingers) == 0:
str_guested = "0"
serial.write("0".encode())
else:
str_guested = " "
return str_guested
if __name__ == "__main__":
serial = serial.Serial('COM4', 115200, timeout=0.5) #此com口根据自己的电脑更改com端口和波特率
if serial.isOpen():
print("open success")
else:
print("open failed")
cap = cv2.VideoCapture(0)
# 定义手 检测对象
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
while True:
# 读取一帧图像
success, img = cap.read()
if not success:
continue
image_height, image_width, _ = np.shape(img)
# 转换为RGB
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 得到检测结果
results = hands.process(imgRGB)
if results.multi_hand_landmarks:
hand = results.multi_hand_landmarks[0]
mpDraw.draw_landmarks(img, hand, mpHands.HAND_CONNECTIONS)
# 采集所有关键点的坐标
list_lms = []
for i in range(21):
pos_x = hand.landmark[i].x * image_width
pos_y = hand.landmark[i].y * image_height
list_lms.append([int(pos_x), int(pos_y)])
# 构造凸包点
list_lms = np.array(list_lms, dtype=np.int32)
hull_index = [0, 1, 2, 3, 6, 10, 14, 19, 18, 17, 10]
hull = cv2.convexHull(list_lms[hull_index, :])
# 绘制凸包
cv2.polylines(img, [hull], True, (0, 255, 0), 2)
# 查找外部的点数
n_fig = -1
ll = [4, 8, 12, 16, 20]
up_fingers = []
for i in ll:
pt = (int(list_lms[i][0]), int(list_lms[i][1]))
dist = cv2.pointPolygonTest(hull, pt, True)
if dist < 0:
up_fingers.append(i)
# print(up_fingers)
# print(list_lms)
# print(np.shape(list_lms))
str_guester = get_str_guester(up_fingers, list_lms)
cv2.putText(img, ' %s' % str_guester, (90, 90), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 255, 0), 4,
cv2.LINE_AA)
for i in ll:
pos_x = hand.landmark[i].x * image_width
pos_y = hand.landmark[i].y * image_height
# 画点
cv2.circle(img, (int(pos_x), int(pos_y)), 3, (0, 255, 255), -1)
cv2.imshow("hands", img)
key = cv2.waitKey(1) & 0xFF
# 按键 "q" 退出
if key == ord('q'):
break
cap.release()
Python
1
https://gitee.com/t-maker-jay/hands-gesture.git
git@gitee.com:t-maker-jay/hands-gesture.git
t-maker-jay
hands-gesture
opencv手势视觉识别
master

搜索帮助