如何在不使用time.sleep()时实现3秒倒计时(适配摄像头游戏场景)
石头剪刀布游戏倒计时函数优化
需求
实现一个从3到1递减的倒计时函数,用于摄像头识别出拳的石头剪刀布游戏:
- 程序启动后立即后台运行摄像头图像捕获
- 摄像头就绪后触发倒计时
- 倒计时结束时抓拍用户出拳画面
- 禁止用
time.sleep()阻塞进程,避免摄像头启动耗时过长
当前问题
现有代码存在两个明显问题:
- 计数方向错误:打印的是已流逝时间(从1到3递增),而非剩余倒计时(从3到1递减)
- 重复输出:循环中多次打印同一个数字
现有代码:
import time def countdown(): countdown_time = 3 start_time = time.time() while (time.time() - start_time) < countdown_time: print(round(time.time() - start_time)) if (time.time() - start_time) >= countdown_time: break
实际输出示例:
1 1 1 2 2 2 3 3 3
期望输出:
3 2 1
优化方案
解决要点
- 计算剩余倒计时时间,实现从3到1的递减逻辑
- 记录上一次打印的数字,仅当数字变化时输出,避免重复打印
- 保持循环非阻塞,确保摄像头捕获进程能并行运行
优化后倒计时代码
import time def countdown(): countdown_time = 3 start_time = time.time() last_printed = None # 跟踪上一次输出的数字 while True: elapsed = time.time() - start_time # 计算当前剩余倒计时,确保范围在1到3之间 current_num = max(1, int(countdown_time - elapsed)) # 仅当数字变化且未到倒计时结束时打印 if current_num != last_printed and elapsed < countdown_time: print(current_num) last_printed = current_num # 倒计时结束时退出循环 if elapsed >= countdown_time: break # 短时间休眠降低CPU占用,不阻塞摄像头进程 time.sleep(0.01)
摄像头并行处理实现
要让摄像头在后台持续捕获,可将摄像头逻辑放在单独线程中,与倒计时并行执行:
import threading import cv2 def camera_feed(): cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 可添加实时显示或预处理逻辑 cv2.imshow('Camera', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() # 启动摄像头守护线程(主程序结束自动退出) cam_thread = threading.Thread(target=camera_feed) cam_thread.daemon = True cam_thread.start() # 等待摄像头初始化(可根据设备调整时长) time.sleep(0.5) # 执行倒计时 countdown() # 倒计时结束后抓拍出拳画面 cap = cv2.VideoCapture(0) ret, punch_frame = cap.read() if ret: cv2.imwrite('user_punch.jpg', punch_frame) cap.release()
内容的提问来源于stack exchange,提问作者luke
相关产品推荐
相关产品推荐

