如何在OpenCV视频循环中使用time.sleep且不暂停画面?
解决OpenCV手势检测中打印提示时画面暂停的问题
time.sleep(2)会阻塞整个主线程,而OpenCV的视频帧读取、处理和显示都运行在这个主线程中,因此会导致画面暂停,不能用这种方式限制打印频率。
可以通过记录上次触发打印的时间戳来实现需求,每次循环时计算当前时间与上次打印时间的差值,只有当差值大于等于2秒时才执行打印操作,这样不会阻塞主线程,视频画面能正常刷新。
修改后的完整代码如下:
import time import cv2 import mediapipe as mp # 初始化MediaPipe手部检测和OpenCV视频捕获 mp_hands = mp.solutions.hands hands = mp_hands.Hands(static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5) mp_drawing = mp.solutions.drawing_utils cap = cv2.VideoCapture(0) last_print_time = 0 # 记录上次打印"hi"的时间戳 while True: ret, frame = cap.read() if not ret: break # 转换为MediaPipe需要的RGB格式并处理 frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = hands.process(frame_rgb) INDEX_UP = False # 判断食指是否抬起(根据手部关键点坐标判断) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # 食指指尖(INDEX_FINGER_TIP)的y坐标小于指根(INDEX_FINGER_MCP)表示抬起 index_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP] index_mcp = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_MCP] if index_tip.y < index_mcp.y: INDEX_UP = True # 绘制手部关键点连线 mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS) current_time = time.time() # 满足食指抬起且距离上次打印超过2秒时执行打印 if INDEX_UP and (current_time - last_print_time) >= 2: print("hi") last_print_time = current_time # 更新时间戳 cv2.imshow("Frame", frame) # 按ESC键退出循环 if cv2.waitKey(1) & 0xFF == 27: break # 释放资源 cap.release() cv2.destroyAllWindows()
核心逻辑说明
last_print_time变量存储上次打印的时间戳,初始值设为0- 每次循环获取当前时间
current_time,计算与上次打印时间的差值 - 只有当食指抬起且时间差≥2秒两个条件同时满足时,才打印"hi"并更新
last_print_time - 整个流程不会阻塞主线程,视频帧能持续读取、处理和显示,画面保持流畅
内容的提问来源于stack exchange,提问作者Alan Richter
相关产品推荐
相关产品推荐

