Поведение функции createBackgroundSubtractorMOG2 в opencv - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь создать сигнал тревоги при обнаружении движения с помощью функции 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 Ответ

0 голосов
/ 03 декабря 2018

Причина возникновения такой проблемы заключается в том, что 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()

Надеюсь, это поможет

...