1.提出需求
我要开发一个手势控制写字的应用,大拇指和食指捏合时绘制轨迹并在屏幕上显示,请问有什么思路吗?
2.确定路线,划分模块
那就用python开发吧,具体包含哪些功能模块呢?需要导入哪些工具包?
根据提供的修改步骤进行代码生成。
3.提出修改意见
选中需要修改的代码,提出修改意见:“让轨迹点连起来。”
import cv2
import mediapipe as mp
import numpy as np
# 打开摄像头进行实时视频流的捕获并实时展示
def video_capture():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("无法接收帧(视频流已结束?)")
break
frame = cv2.flip(frame, 1)
# 调用detect_and_draw_hand_landmarks函数
hand_landmarks = detect_and_draw_hand_landmarks(frame)
# 调用draw_palm_points函数
draw_palm_points(frame, hand_landmarks)
cv2.imshow('Frame', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# 测量手部区域上的关键点和边缘,并呈现关键点
def detect_and_draw_hand_landmarks(frame):
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False,
max_num_hands=2)
mp_drawing = mp.solutions.drawing_utils
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hands.process(rgb_image)
hand_landmarks = None
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(frame, hand_landmarks)
hands.close()
return hand_landmarks
# 描绘手指捏合时的轨迹点跟踪与显示
def draw_palm_points(frame, hand_landmarks, history_palm_points=[]):
if not hand_landmarks:
history_palm_points.clear()
return
thumb_index = 4
indexfinger_index = 8
indexfinger_point = hand_landmarks.landmark[indexfinger_index]
thumb_point = hand_landmarks.landmark[thumb_index]
finger_distance = np.sqrt((thumb_point.x - indexfinger_point.x) ** 2
+ (thumb_point.y - indexfinger_point.y) ** 2)
if finger_distance < 0.1:
palm_point = [int((thumb_point.x + indexfinger_point.x) * frame.shape[1] // 2),
int((thumb_point.y + indexfinger_point.y) * frame.shape[0] // 2)]
history_palm_points.append(palm_point)
if len(history_palm_points) < 2:
pass
else:
for i in range(1, len(history_palm_points)):
cv2.line(frame, tuple(history_palm_points[i-1][:2]), tuple(history_palm_points[i][:2]), (0, 255, 0), 5)
# 调用video_capture函数
if __name__ == '__main__':
video_capture()