Бесконечно включать и выключать веб-камеру? - PullRequest
0 голосов
/ 12 февраля 2019

Я написал код, который будет в конечном итоге захватывать изображения и завершаться по истечении определенного времени.Но как только сценарий будет завершен (т.е. после завершения кода с использованием времени), как я буду автоматически запускаться через несколько секунд?несколько секунд.Как настроить автоматическое повторное выполнение кода через несколько минут для повторного захвата еще нескольких изображений?

Спасибо, заранее.

1 Ответ

0 голосов
/ 12 февраля 2019

Если вы находитесь в 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 минут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...