You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用time.sleep()时实现3秒倒计时(适配摄像头游戏场景)

石头剪刀布游戏倒计时函数优化

需求

实现一个从3到1递减的倒计时函数,用于摄像头识别出拳的石头剪刀布游戏:

  • 程序启动后立即后台运行摄像头图像捕获
  • 摄像头就绪后触发倒计时
  • 倒计时结束时抓拍用户出拳画面
  • 禁止用time.sleep()阻塞进程,避免摄像头启动耗时过长

当前问题

现有代码存在两个明显问题:

  1. 计数方向错误:打印的是已流逝时间(从1到3递增),而非剩余倒计时(从3到1递减)
  2. 重复输出:循环中多次打印同一个数字

现有代码:

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

优化方案

解决要点

  1. 计算剩余倒计时时间,实现从3到1的递减逻辑
  2. 记录上一次打印的数字,仅当数字变化时输出,避免重复打印
  3. 保持循环非阻塞,确保摄像头捕获进程能并行运行

优化后倒计时代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:25:13