做网站的运营维护都要学什么,运行两个wordpress,企业网属于什么网,宁波市住房和城乡建设局网站首页目录
概要
实现思路
整体代码实现
效果展示
总结 概要 实时手部检测与绘图应用#xff0c;通过摄像头捕捉视频流#xff0c;使用 MediaPipe 识别手部关键点#xff0c;判断食指是否伸展且其他手指是否弯曲#xff0c;在满足条件时在画布上绘制圆点#xff0c;并实时显…目录
概要
实现思路
整体代码实现
效果展示
总结 概要 实时手部检测与绘图应用通过摄像头捕捉视频流使用 MediaPipe 识别手部关键点判断食指是否伸展且其他手指是否弯曲在满足条件时在画布上绘制圆点并实时显示合成的图像支持用户通过按 q 键退出。难道你就不想使用这个功能给你的女朋友画一个爱心吗 实现思路 导入库 导入 OpenCV 用于图像处理和视频流操作导入 MediaPipe 用于手部检测和关键点识别。 初始化手部模块 使用 MediaPipe 的手部模块创建一个手部检测对象以便后续进行手部关键点的识别。 设置摄像头 使用 OpenCV 打开摄像头准备读取视频流。 循环处理视频流 进入一个循环持续读取摄像头的视频帧直到摄像头关闭或用户终止。 镜像翻转 对每一帧进行水平翻转以消除镜像效果使用户看到的画面更自然。 颜色转换 将 BGR 格式的帧转换为 RGB 格式以适应 MediaPipe 的处理需求。 手部关键点识别 通过 MediaPipe 处理 RGB 帧得到手部的关键点数据。 创建画布 初始化一个画布用于存储绘制的内容最初用第一帧的图像填充。 手部标记绘制 如果检测到手部关键点遍历每个手的关键点并在视频帧上绘制手部连接线。 手指状态判断 获取食指和其他手指的关键点位置通过比较坐标判断食指是否伸展和其他手指是否弯曲。 绘制逻辑 如果条件满足食指伸展且其他手指弯曲则在画布上绘制一个圆点表示绘图操作。 结果显示 将当前帧和画布合成一张图像通过 OpenCV 的窗口显示出来让用户看到实时绘图效果。 退出机制 设置按键事件当用户按下 q 键时退出循环释放摄像头并关闭所有窗口。 整体代码实现
import cv2
import mediapipe as mp
import time# 初始化 MediaPipe 手部模块
mp_hands mp.solutions.hands
hands mp_hands.Hands()# 初始化画布
canvas None# 初始化摄像头
cap cv2.VideoCapture(0)# 初始化 FPS 计数
fps_counter 0
fps_start_time time.time()while cap.isOpened():ret, frame cap.read()if not ret:break# 翻转帧以消除镜像效果frame cv2.flip(frame, 1)# 转换颜色空间frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)results hands.process(frame_rgb)# 创建画布if canvas is None:canvas frame.copy()# 绘制手部标记并检测手指位置if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:mp.solutions.drawing_utils.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)# 获取手指位置index_finger_tip hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]index_finger_dip hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_DIP]middle_finger_tip hand_landmarks.landmark[mp_hands.HandLandmark.MIDDLE_FINGER_TIP]ring_finger_tip hand_landmarks.landmark[mp_hands.HandLandmark.RING_FINGER_TIP]pinky_tip hand_landmarks.landmark[mp_hands.HandLandmark.PINKY_TIP]# 判断手指状态index_straight index_finger_tip.y index_finger_dip.y # 食指是否伸展other_fingers_curled (middle_finger_tip.y middle_finger_tip.y - 0.05 and # 中指弯曲ring_finger_tip.y ring_finger_tip.y - 0.05 and # 无名指弯曲pinky_tip.y pinky_tip.y - 0.05 # 小指弯曲)# 如果食指伸展且其他手指弯曲则绘制if index_straight and other_fingers_curled:h, w, _ frame.shapex, y int(index_finger_tip.x * w), int(index_finger_tip.y * h)cv2.circle(canvas, (x, y), 10, (255, 255, 0), -1)# 计算 FPSfps_counter 1if time.time() - fps_start_time 1.0:fps fps_counterfps_counter 0fps_start_time time.time()else:fps 0 # 在计算间隔内不显示 FPS# 在帧上显示 FPScv2.putText(frame, fFPS: {fps}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示结果cv2.imshow(Drawing with Hand, cv2.addWeighted(frame, 0.5, canvas, 0.5, 0))if cv2.waitKey(1) 0xFF ord(q):breakcap.release()
cv2.destroyAllWindows()效果展示 手部绘制boke 总结 我说白了我白说了不总结了