From c24607d5b2ecd3e0f67a3fc902e70fcfc8b701cf Mon Sep 17 00:00:00 2001 From: talksik Date: Wed, 28 Jun 2023 14:56:07 -0700 Subject: [PATCH] simple object detection --- main.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..a4514e5 --- /dev/null +++ b/main.py @@ -0,0 +1,113 @@ +# Python program to implement +# Webcam Motion Detector + +# importing OpenCV, time and Pandas library +import cv2, time, pandas +# importing datetime class from datetime library +from datetime import datetime + +# Assigning our static_back to None +static_back = None + +# List when any moving object appear +motion_list = [ None, None ] + +# Time of movement +time = [] + +# Initializing DataFrame, one column is start +# time and other column is end time +df = pandas.DataFrame(columns = ["Start", "End"]) + +# Capturing video +video = cv2.VideoCapture(0) + +# Infinite while loop to treat stack of image as video +while True: + # Reading frame(image) from video + check, frame = video.read() + + # Initializing motion = 0(no motion) + motion = 0 + + # Converting color image to gray_scale image + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + + # Converting gray scale image to GaussianBlur + # so that change can be find easily + gray = cv2.GaussianBlur(gray, (21, 21), 0) + + # In first iteration we assign the value + # of static_back to our first frame + if static_back is None: + static_back = gray + continue + + # Difference between static background + # and current frame(which is GaussianBlur) + diff_frame = cv2.absdiff(static_back, gray) + + # If change in between static background and + # current frame is greater than 30 it will show white color(255) + thresh_frame = cv2.threshold(diff_frame, 30, 255, cv2.THRESH_BINARY)[1] + thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2) + + # Finding contour of moving object + cnts,_ = cv2.findContours(thresh_frame.copy(), + cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + for contour in cnts: + if cv2.contourArea(contour) < 10000: + continue + motion = 1 + + (x, y, w, h) = cv2.boundingRect(contour) + # making green rectangle around the moving object + cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3) + + # Appending status of motion + motion_list.append(motion) + + motion_list = motion_list[-2:] + + # Appending Start time of motion + if motion_list[-1] == 1 and motion_list[-2] == 0: + time.append(datetime.now()) + + # Appending End time of motion + if motion_list[-1] == 0 and motion_list[-2] == 1: + time.append(datetime.now()) + + # Displaying image in gray_scale + cv2.imshow("Gray Frame", gray) + + # Displaying the difference in currentframe to + # the staticframe(very first_frame) + cv2.imshow("Difference Frame", diff_frame) + + # Displaying the black and white image in which if + # intensity difference greater than 30 it will appear white + cv2.imshow("Threshold Frame", thresh_frame) + + # Displaying color frame with contour of motion of object + cv2.imshow("Color Frame", frame) + + key = cv2.waitKey(1) + # if q entered whole process will stop + if key == ord('q'): + # if something is movingthen it append the end time of movement + if motion == 1: + time.append(datetime.now()) + break + +# Appending time of motion in DataFrame +for i in range(0, len(time), 2): + df = df.append({"Start":time[i], "End":time[i + 1]}, ignore_index = True) + +# Creating a CSV file in which time of movements will be saved +df.to_csv("Time_of_movements.csv") + +video.release() + +# Destroying all the windows +cv2.destroyAllWindows()