我使用R-Pi
和cam
。我已经编写了一段代码,可以在一个小时内迭代这个过程。你知道吗
import numpy as np
import cv2
import time
ret, frame = cam0.read()
timecheck = time.time()
future = 60
runNo = 0
while ret:
if time.time() >= timecheck:
ret, frame = cam0.read()
#Do something here
timecheck = time.time()+future
runNo=runNo+1
if(runNo> 60):
break
else:
ret = cam0.grab()
#save log as .txt file
with open("acc_list.txt", "w") as output:
output.write(str(acc_list))
但有时,完成工作不到一个小时。我想在runNo
到达60
之前退出迭代。因为我必须保存acc_list.txt
文件,所以不能直接关闭程序。你知道吗
如果是视频流,我会用这个:
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
if cv2.waitKey(1) & 0xFF == ord('q'):
break
但是我在修改代码时遇到了错误。你知道吗
有什么好办法吗?你知道吗
有很多可能的方法,有些更干净,有些更脏:-)
没有特别的顺序,这里有一些。我可能会为它们添加代码,因为我会利用空闲时间对它们进行适当的解释。你知道吗
方法1-使用sentinel文件
要做到这一点,一个简单的方法是在循环内部检查名为
stop
的文件是否存在。然后在shell/Terminal中,只需执行以下操作:程序将退出。如果您碰巧使用
bash
,您可以键入:记住删除程序开头和结尾名为
stop
的文件。你知道吗我不是Python程序员,但这是可行的:
方法2-使用第二个线程
另一种方法是启动第二个线程,该线程从终端执行阻塞读取,当用户输入某个内容时,它设置一个标志,主线程通过其循环在每次迭代时检查该标志,与检查
runNo
相同。你知道吗这表明:
这对于OpenCV可能不是最好的,因为
imshow()
函数以某种方式使用waitKey()
函数中的空闲时间(以毫秒参数给出)来更新屏幕。如果您调用imshow()
而没有任何后续的waitKey()
,您将看到这一点-屏幕上将不会显示任何内容。你知道吗因此,如果您使用的是
imshow()
,则必须使用waitKey()
,这将干扰第二个线程中的键盘读取。如果是这样的话,就用另外一种方法。你知道吗方法3-增量写入结果
第三种方法是在循环中打开append的结果文件,并在新结果可用时添加,而不是等到最后。你知道吗
我对你的算法知之甚少,不知道这对你是否可行。你知道吗
我仍然不是Python程序员,但这是可行的:
方法4-使用信号
第四种方法是设置一个信号处理程序,当它接收到信号时,它设置一个标志,主循环在每次迭代中检查这个标志。然后在您使用的终端中:
见documentation on signals.
以下是一些工作代码:
样本输出
讨论
但是我觉得方法3是最干净的,方法1是最大的漏洞。方法2可能与你要求的最接近,我做了方法4(事实上还有其他方法),所以我可以学到一些东西。你知道吗
如果任何真正的Python程序员有什么意见,我很乐意学习。你知道吗
相关问题 更多 >
编程相关推荐