如何在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库监听键盘输入:
- 先安装依赖:
pip install pynput - 修改按键监听部分:
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
相关产品推荐
相关产品推荐

