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

如何在R-Pi相机循环中提前终止并保存acc_list.txt文件?

解决树莓派摄像头循环的手动退出问题

嘿,我明白你的困扰——想在循环没跑完一小时前手动终止,还得确保acc_list.txt能被正确保存,之前加cv2.waitKey出错肯定是因为没适配好原有的循环逻辑。我来给你调整下代码,完美解决这个问题:

核心问题分析

你的原循环大部分时间在执行cam0.grab()跳过帧,只有每60秒才会执行一次read()和业务逻辑。如果只在read()的分支里检查按键,可能要等很久才能响应退出指令,而且没处理摄像头资源释放和窗口事件,这就是出错的原因。

修改后的完整代码

import numpy as np
import cv2
import time

# 初始化摄像头(根据你的设备编号调整)
cam0 = cv2.VideoCapture(0)
acc_list = []  # 假设这是你要保存的目标列表

ret, frame = cam0.read()
timecheck = time.time()
future = 60
runNo = 0
# 创建窗口用于显示画面(不需要显示可注释,但waitKey仍需保留)
cv2.namedWindow("Camera Feed", cv2.WINDOW_NORMAL)

try:
    while ret:
        # 每次循环都检查按键,确保实时响应退出指令
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            print("手动触发退出")
            break

        if time.time() >= timecheck:
            ret, frame = cam0.read()
            if ret:
                # 这里放你的业务逻辑,比如处理帧并更新acc_list
                # Do something here
                print(f"执行第{runNo+1}次操作")
                acc_list.append(f"操作{runNo+1}的记录")  # 示例:添加数据到列表
                
                timecheck = time.time() + future
                runNo += 1
                if runNo >= 60:
                    print("达到最大执行次数,自动退出")
                    break
        else:
            # 跳过当前帧,节省系统资源
            ret = cam0.grab()
finally:
    # 无论循环因何终止,都确保保存文件+释放资源
    print("正在保存acc_list到文件...")
    with open("acc_list.txt", "w") as output:
        output.write(str(acc_list))
    # 释放摄像头硬件资源
    cam0.release()
    # 销毁cv2窗口(如果创建过)
    cv2.destroyAllWindows()
    print("资源已释放,程序结束")

关键调整点

  • 实时按键检查:把cv2.waitKey(1)放到循环最开头,这样不管是在等待下一次执行还是跳过帧,都能立刻响应q键退出,不会出现延迟。
  • try-finally安全块:用finally确保所有退出场景(手动中断、满60次执行、摄像头读取失败)下,acc_list.txt都会被保存,同时避免树莓派上的摄像头资源泄漏。
  • 完善的退出分支:同时处理了三种终止循环的情况,逻辑更健壮。

无头模式(无外接显示器)的备选方案

如果你的树莓派是无头运行(没有显示器),cv2.waitKey可能无法正常工作,这时候可以用pynput库监听键盘输入:

  1. 先安装依赖:pip install pynput
  2. 修改按键监听部分:
from pynput.keyboard import Listener, Key

exit_flag = False

def on_press(key):
    global exit_flag
    try:
        if key.char == 'q':
            exit_flag = True
            return False  # 停止监听线程
    except AttributeError:
        pass

# 启动后台键盘监听
listener = Listener(on_press=on_press)
listener.start()

# 循环中检查退出标记
while ret and not exit_flag:
    # ... 原循环逻辑 ...
    if exit_flag:
        print("手动触发退出")
        break

# 停止监听
listener.stop()

这样即使没有显示器,也能通过按q键手动退出,同时保证文件正常保存。

内容的提问来源于stack exchange,提问作者YYK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:39:00