我正在使用网络摄像头在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。
我希望你明白我的目的。我骑着守护进程和线程,但我无法解释这么多。
答案 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()