Если вы находитесь в Windows, вы можете добавить сценарий .py
в планировщик задач и дать ему время для запуска, , описанное здесь :
Однако, если вы хотите сделатьв вашем файле python есть несколько способов.
Первый подход:
Блокировка таймера вместо break
выхода из цикла.
Что-то вроде:
import time
starttime=time.time()
while True:
print("tick every 3 seconds")
time.sleep(3)
Таким образом, ваш код должен быть:
import cv2
import time
import numpy
capture = cv2.VideoCapture(0)
capture.set(3,640)
capture.set(4,480)
img_counter = 0
frame_set = []
start_time = time.time()
while(True):
ret , frame = capture.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
frame_set.append(gray)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
end_time = time.time()
elapsed = end_time - start_time
img_name = "opencv_frame_{}.png".format(img_counter)
cv2.imwrite(img_name,gray)
print("{} written!".format(img_counter))
img_counter +=1
if elapsed > 1:
capture.release()
cv2.destroyAllWindows()
time.sleep(3)
Второй подход:
Использование Twisted, который представляет собой управляемый событиями сетевой движок, написанный наPython. ,
from twisted.internet import task, reactor
timeout = 60.0 # Sixty seconds
def doWork():
#do work here
pass
l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds
reactor.run()
В этом случае вам не нужна временная блокировка:
from twisted.internet import task, reactor
import cv2
import time
import numpy
capture = cv2.VideoCapture(0)
capture.set(3,640)
capture.set(4,480)
img_counter = 0
frame_set = []
start_time = time.time()
timeout = 60.0 # Sixty seconds
def doWork():
while (True):
ret, frame = capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame_set.append(gray)
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
end_time = time.time()
elapsed = end_time - start_time
img_name = "opencv_frame_{}.png".format(img_counter)
cv2.imwrite(img_name, gray)
print("{} written!".format(img_counter))
img_counter += 1
if elapsed > 1:
break
capture.release()
cv2.destroyAllWindows())
l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds
reactor.run()
Примечание: поскольку вы снимаете фотографии и завершаетепосле того, как сценарий достигнет определенного времени, вам нужно синхронизировать timeout
в этом случае с вашим временем elapsed
, чтобы убедиться, что он не сталкивается.т.е. если сценарий захватывает изображения в течение 5 минут, то время ожидания должно быть больше этого.Другими словами, запустите скрипт после, скажем, 7 минут, и для захвата изображений потребуется 5 минут.