引言
这期就用 CodeBuddy 来完成一个手势识别程序,其实只要一次交互就能完成,他的能力还是蛮强的。之前说他能做到很多功能,所有就来多写几个案例,帮助各位更好的去使用,或者这能给你一些新思路。说到手势识别那其实各位都接触过不少,要么就是游戏当中的手势识别或者就是在学习过程接触过类似的内容,我们就先不多说了,我们看下文。
安装 python
这里的 python 用的是 3.9.13 版本,根据你的系统来进行安装。
我们下载之后会得到这个文件,我们可以双击打开安装即可,这里就不演示过程了。
安装依赖
这里我们先打开 VS Code,这里用这个 IDE 工具进行演示。
然后这里再打开 PowerShell 安装一下依赖,命令如下:
pip install mediapipe opencv-python
复制代码
中国大陆地区可能出现无法下载等情况,自己可以想办法去解决一下。
使用 CodeBuddy
我们新建文件夹,然后这个文件夹用 VS Code 打开即可。
然后看到左侧的 CodeBuddy,点击即可。
这里用 Craft 模式,我们这里就可以输入自然语言了,Vibe Coding 能力还是很突出的。
其实只要这一句话,他就能完整的生成出来,后续精调一两次就差不多了。
他会进行思考,思考完毕就能完整的生成出项目了。
生成的代码
这里附上生成精调之后的代码,各位可以直接用 python 运行。
import cv2
import mediapipe as mp
import numpy as np
from collections import deque
# 初始化MediaPipe Hands
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
static_image_mode=False,
max_num_hands=1,
min_detection_confidence=0.7,
min_tracking_confidence=0.5)
mp_drawing = mp.solutions.drawing_utils
# 手势历史记录,用于平滑处理
gesture_history = deque(maxlen=5)
def get_hand_landmarks_array(landmarks):
"""将landmarks转换为numpy数组"""
return np.array([(lm.x, lm.y, lm.z) for lm in landmarks])
def recognize_gesture(hand_landmarks):
"""平衡版手势识别逻辑"""
landmarks = hand_landmarks.landmark
points = get_hand_landmarks_array(landmarks)
# 获取关键点索引
WRIST = 0
THUMB_TIP = 4; THUMB_MCP = 2
INDEX_TIP = 8; INDEX_MCP = 5
MIDDLE_TIP = 12; MIDDLE_MCP = 9
RING_TIP = 16; RING_MCP = 13
PINKY_TIP = 20; PINKY_MCP = 17
# 计算各手指弯曲程度(指尖到MCP的距离)
thumb_dist = np.linalg.norm(points[THUMB_TIP] - points[THUMB_MCP])
index_dist = np.linalg.norm(points[INDEX_TIP] - points[INDEX_MCP])
middle_dist = np.linalg.norm(points[MIDDLE_TIP] - points[MIDDLE_MCP])
ring_dist = np.linalg.norm(points[RING_TIP] - points[RING_MCP])
pinky_dist = np.linalg.norm(points[PINKY_TIP] - points[PINKY_MCP])
# 计算指尖间距离
thumb_index_dist = np.linalg.norm(points[THUMB_TIP] - points[INDEX_TIP])
index_middle_dist = np.linalg.norm(points[INDEX_TIP] - points[MIDDLE_TIP])
# 1. OK手势判断(最高优先级)
ok_gesture = (
thumb_index_dist < 0.1 and # 拇指食指接触
middle_dist > 0.2 and # 其他手指伸展
ring_dist > 0.2 and
pinky_dist > 0.2
)
# 2. 竖起大拇指判断
thumbs_up = (
thumb_dist > 0.25 and # 拇指伸展
index_dist < 0.15 and # 其他手指弯曲
middle_dist < 0.15 and
ring_dist < 0.15 and
pinky_dist < 0.15
)
# 3. 握拳判断
fist = (
thumb_dist < 0.15 and # 所有手指弯曲
index_dist < 0.12 and
middle_dist < 0.12 and
ring_dist < 0.12 and
pinky_dist < 0.12 and
np.linalg.norm(points[INDEX_MCP] - points[PINKY_MCP]) < 0.25 # 手掌收紧
)
# 4. 张开手掌判断
open_hand = (
thumb_dist > 0.2 and # 所有手指伸展
index_dist > 0.3 and
middle_dist > 0.3 and
ring_dist > 0.3 and
pinky_dist > 0.3 and
thumb_index_dist > 0.2 # 手指间有足够间距
)
# 确定手势(按优先级顺序)
if ok_gesture:
return "OK"
elif thumbs_up:
return "Thumbs Up"
elif fist:
return "Fist"
elif open_hand:
return "Open Hand"
else:
return "Unknown"
# 主程序(添加调试信息显示)
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
continue
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hands.process(frame_rgb)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(
frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
current_gesture = recognize_gesture(hand_landmarks)
gesture_history.append(current_gesture)
if len(gesture_history) >= 3:
final_gesture = max(set(gesture_history), key=gesture_history.count)
else:
final_gesture = current_gesture
# 显示识别结果和关键距离(调试用)
debug_text = f"{final_gesture}"
cv2.putText(frame, debug_text, (10, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Hand Gesture Recognition', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
复制代码
整体代码其实不多,我们接下来看看实际效果。
效果展示
这里直接给出图片吧,方便展示效果。
这里总共就四种手势识别,效果可以参考图片,均为截屏。电脑自带的摄像头像素不好,可能很糊。
结语
整个过程只用了无轮对话,效果还是非常好的,这里各位应该对 CodeBuddy 的能力有着更进一步的了解,希望你能对本期的手势识别的内容有着兴趣,也期待你的脑洞大开,那么我们下期见。
评论