Поведение функции createBackgroundSubtractorMOG2 в opencv
Я пытаюсь создать сигнал тревоги при обнаружении движения с помощью функции 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()
Проблема возникает из-за того, что программа приостанавливается на 2 секунды, когда вызывается функция winsound.Beep, а после возобновления работы программы происходит сбой и неоднократно начинается звуковой сигнал.
Если я удаляю функцию winsound.Beep, программа работает как положено. Почему это происходит?
1 ответ
Причина, по которой вы испытываете такую проблему, заключается в том, что 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()
Надеюсь это поможет