Я пытаюсь построить Motion Detector, используя openCV и python, но окно дисплея не отвечает, когда я завершаю программу - PullRequest
0 голосов
/ 10 ноября 2018

Вот код для того же самого, посмотрите на него. В приведенном ниже коде я создаю детектор движения, и вместе с этим я буду записывать время появления и исчезновения различных объектов, для которых я использую фрейм данных.

Проблема в том, что программа выполняется, но когда вывод отображается в виде окна, он останавливается, когда я пытаюсь завершить работу.

import cv2, pandas
from datetime import datetime

first_frame = None
status_list = [None,None]
times = []
df = pandas.DataFrame(columns=["Start", "End"]) #Dataframe to store the time values during which object detection and movement appears.


video = cv2.VideoCapture(0)#VideoCapture object is used to record video using web cam

while True:
    #check is a bool data type, returns true if VideoCapture object is read
    check,frame = video.read()
    status = 0
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)  # For converting the frame color to gray scale
    gray = cv2.GaussianBlur(gray,(21,21),0)  # For converting the gray scale frame to GaussianBlur

    if first_frame is None:
        first_frame = gray   # used to store the first image/frame of the video
        continue
    delta_frame = cv2.absdiff(first_frame,gray)#calculates the difference between first and other frames
    thresh_delta = cv2.threshold(delta_frame,30,255,cv2.THRESH_BINARY)[1]
    thresh_delta = cv2.dilate(thresh_delta,None,iterations=0) #Provides threshold value, so if the difference is <30 it will turn to black otherwise if >30 pixels will turn to white
    (_,cnts,_) = cv2.findContours(thresh_delta.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #Define the contour area,i.e. adding borders

    #Removing noises and shadows, any part which is greater than 1000 pixels will be converted to white
    for contour in cnts:
        if cv2.contourArea(contour) < 1000:
            continue
        status = 1 #change in status when the object is detected
        #Creating a rectangular box around the object in frame
        (x,y,w,h) = cv2.boundingRect(contour)
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3)

    #list of status for every frame
    status_list.append(status)

    status_list=status_list[-2:]

    #Record datetime in a list when change occurs
    if status_list[-1]==1 and status_list[-2]==0:
        times.append(datetime.now())
    if status_list[-1]==0 and status_list[-2]==1:
        times.append(datetime.now())

    cv2.imshow('frame',frame)
    #cv2.imshow('Capturing',gray)
    #cv2.imshow('delta',delta_frame)
    #cv2.imshow('thresh',thresh_delta)

    key = cv2.waitKey(1) #changing the frame after 1 millisecond

    #Used for terminating the loop once 'q' is pressed
    if key == ord('q'):
        break

print(status_list)
print(times)

for i in range(0,len(times),2):
    df = df.append({"Start":times[i],"End":times[i+1]},ignore_index=True)

df.to_csv("Times.csv")

video.release()
cv2.destroyAllWindows #will be closing all the windows

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Вы можете попробовать это.

k = cv2.waitKey(1) & 0xFF
if k == 27 :        
     break

где k может быть любым кодом ASCII на клавиатуре Справка по ASCII-коду

В данном случае 27 - кнопка «Esc».

Однако, проблема, с которой вы сталкиваетесь, когда она зависает, вы пытались непрерывно нажимать любую кнопку, кроме q? У меня была похожая проблема, когда я тестировал учебный код OpenCV здесь

но я понял это, поиграв, а затем осознав, что мне нужно удерживать любую кнопку, кроме кнопки «выход».

0 голосов
/ 10 ноября 2018

Попробуйте это:

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

Краткое пояснение о том, что такое "& 0xFF", см. В Для чего нужен 0xFF в cv2.waitKey (1)?

Это в основном битовая маска, которая принимает часть значения waitKey (32 бита), которую можно сравнить с ASCII (8 бит).

...