如何在python上的while循环中每个特定时间运行一个函数?

时间:2017-01-04 07:44:39

标签: python while-loop webcam

我正在使用网络摄像头在OCR项目中工作。我想知道如何在主代码仍在运行时每隔3秒(例如)运行一个函数。代码很长。所以我用下面的例子来说明:

import cv2

cap = cv2.VideoCapture(0)

def capture():
    cv2.imwrite("frame.jpg", frame)

while(1):
    ret, frame = cap.read()
    cv2.imshow('Webcam', frame)
    (_, cnt, _) = cv2.findContours(frame, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    if len(cnt) > 10:
        # here I want to call capture() function every 3 seconds

    if cv2.waitKey(1) & 0xFF == ord('x'):
        break

cap.release()
cv2.destroyAllWindows()

我在time.sleep(3)函数的语句之后使用了capture(),但它暂停了帧的连续捕获。我不想要它。我需要像软件中断这样的东西。当旗帜射击时,功能代码运行但是while循环继续工作。

我在Windows 7上使用python 2.7。

我希望你明白我的目的。我骑着守护进程和线程,但我无法解释这么多。

3 个答案:

答案 0 :(得分:0)

可能最好用线程(see multiprocessing)执行此操作,但下面的简单解决方案

注意:由于opencv功能需要花费时间并且可能等待您的网络摄像头提供帧,因此不会每3秒启动一次。

注意2:如果不使用任何类型的多线程,您的OCR代码将阻止您的网络摄像头捕获,因此请快速制作OCR或查看上面的链接。

"https://github.com/nikt/Finger-Paint"

答案 1 :(得分:0)

这是一个使用线程的相当简单的解决方案。您提到过无法使用ctrl-C退出应用程序。这是因为线程是一个单独的任务,你必须再次点击ctrl-C来杀死该线程。为了解决这个问题,我抓住了$Prodservers = Get-ADComputer -Filter {OperatingSystem -like '*Server*'} -SearchScope Subtree -SearchBase $ProdSB -Server $DCprod -Credential $ProdCred -ErrorAction SilentlyContinue | select -Expand DnsHostname foreach ($P in $Prodservers) { [PSCustomObject]@{ Hostname = $P 'Support team' = (Invoke-Command -ComputerName $P -ScriptBlock {$env:supportteam} -Credential $ProdCred) 'Local Admins' = (Invoke-Command -ComputerName $P -ScriptBlock {$ADSIComputer = [ADSI]('WinNT://localhost,computer');$lgroup = $ADSIComputer.psbase.children.find('Administrators', 'Group');$lgroup.psbase.invoke('members') | % {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}} -Credential $ProdCred) 'Host Reachable' = [bool](Invoke-Command -ComputerName $P -ScriptBlock {1} -Credential $ProdCred) } } 并相应地停止了任务。试试吧。代码是不言自明的,但如果您有任何疑问,请告诉我。

KeyboardInterrupt

答案 2 :(得分:0)

您可以像这样使用

import cv2
import threading
import time

cap=cv2.VideoCapture(0)

main_loop_running = True
def capture():
    global main_loop_running, frame
    while (main_loop_running):
        cv2.imwrite("frame.jpg", frame)
        time.sleep(3)

ret, frame = cap.read()
cv2.imshow('Webcam', frame)
child_t = threading.Thread(target=capture)
child_t.setDaemon(True)
child_t.start()

while(1):
    ret, frame = cap.read()
    cv2.imshow('Webcam', frame)

    # here I want to call capture() function every 3 seconds

    if cv2.waitKey(1) & 0xFF == ord('x'):
        break

main_loop_running = False
child_t.join()

cap.release()
cv2.destroyAllWindows()