我正在尝试通过使用cv2.createBackgroundSubtractorMOG2()函数创建移动检测警报,以检查是否有移动物体并发出警报。 这是我的代码:
import cv2
import numpy as np
import winsound
kernel=np.ones((5,5),np.uint8)
cap=cv2.VideoCapture(0)
fgbg=cv2.createBackgroundSubtractorMOG2()
while True:
ret,frame=cap.read()
fgmask=fgbg.apply(frame) #creates binary image of moving objects
fgmask=cv2.erode(fgmask,kernel,iterations=1) #erosion to remove noise
counter=np.sum(fgmask==255) # counts the number of white pixels in the mask
cv2.imshow('img',fgmask)
cv2.imshow('frame',frame)
print(counter)
if counter>50: #sounds an alarm if the number of white pixels is greater than a certain limit
winsound.Beep(1000,2000)
print("beep")
if (cv2.waitKey(1) & 0xFF)==ord('q'):
break
cap.release()
该问题是由于在调用winsound.Beep函数时程序暂停了2秒钟而引起的,并且在它恢复程序故障并反复开始发出哔哔声之后。
如果我删除winsound.Beep函数,程序将按预期工作。 为什么会这样?
答案 0 :(得分:0)
遇到这种问题的原因是因为winsound.Beep(1000,2000)
是一项阻塞操作,应在单独的线程上运行。
为了完成您要完成的任务,请使用以下工作代码:
import cv2
import numpy as np
import winsound
import threading
kernel=np.ones((5,5),np.uint8)
cap=cv2.VideoCapture(0)
fgbg=cv2.createBackgroundSubtractorMOG2()
def playSound():
winsound.Beep(1000,2000)
while True:
ret,frame=cap.read()
fgmask=fgbg.apply(frame)
fgmask=cv2.erode(fgmask,kernel,iterations=1)
counter=np.sum(fgmask==255)
cv2.imshow('img',fgmask)
cv2.imshow('frame',frame)
if counter>50:
# Run the playSound function on a separate thread
t = threading.Thread(target=playSound)
t.start()
if (cv2.waitKey(1) & 0xFF)==ord('q'):
break
cap.release()
希望这会有所帮助