diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6067b5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ + +data.json + +imgs/* + +__pycache__/ + +.vscode/ diff --git a/mon.py b/mon.py new file mode 100644 index 0000000..ef6e822 --- /dev/null +++ b/mon.py @@ -0,0 +1,40 @@ +import requests +import json +import telebot +import numpy as np +import cv2 + +import time + +login = "./data.json" +loginDataJson = {} + +photos = "./imgs/" +url = "http://192.168.178.25:8000/stream.mjpg" + +def checkCam(): + cap = cv2.VideoCapture(url) + r, img = cap.read() + return img + +def saveImage(img): + name = '{0:010x}'.format(int(time.time() * 256))[:10] + path = photos + name + '.png' + cv2.imwrite(path, img) + return path + +def notify(path): + global loginDataJson + photo = open(path, "rb") + json1 = {"chat_id": loginDataJson["chat_id"]} + files = {'photo': photo} + print(requests.post("https://api.telegram.org/bot" + loginDataJson["key"] + "/sendPhoto", json1, files=files)) + +def loadLogin(): + global loginDataJson + with open(login, 'r', encoding='utf-8') as f: + loginData = f.read() + loginDataJson = json.loads(loginData) + +loadLogin() + diff --git a/motion_detector.py b/motion_detector.py new file mode 100644 index 0000000..784f89e --- /dev/null +++ b/motion_detector.py @@ -0,0 +1,127 @@ +# USAGE +# python motion_detector.py +# python motion_detector.py --video videos/example_01.mp4 + +# import the necessary packages +from imutils.video import VideoStream +import argparse +import datetime +import imutils +import time +import cv2 +import mon + + + +def increase_brightness(img, value=30): + hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) + h, s, v = cv2.split(hsv) + + lim = 255 - value + v[v > lim] = 255 + v[v <= lim] += value + + final_hsv = cv2.merge((h, s, v)) + img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR) + + return img + +def compare(url): + # construct the argument parser and parse the arguments + ap = argparse.ArgumentParser() + ap.add_argument("-v", "--video", help="path to the video file") + ap.add_argument("-amin", "--min-area", type=int, default=3000, help="minimum area size") + ap.add_argument("-amax", "--max-area", type=int, default=10000, help="minimum area size") + args = vars(ap.parse_args()) + + # if the video argument is None, then we are reading from webcam + args["video"] = url + #args["video"] = "./videos/example_02.mp4" + vs = cv2.VideoCapture(args["video"]) + counter = 0 + threashold = 18 + delay = .3 + framerate = 30 + + # initialize the first frame in the video stream + firstFrame = None + + # loop over the frames of the video + while True: + try: + # grab the current frame and initialize the occupied/unoccupied + # text + frame = vs.read() + frame = frame if args.get("video", None) is None else frame[1] + text = "Unoccupied" + + # if the frame could not be grabbed, then we have reached the end + # of the video + if frame is None: + break + + # resize the frame, convert it to grayscale, and blur it + frame = imutils.resize(frame, width=500) + #frame = increase_brightness(frame, value=50) + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + gray = cv2.GaussianBlur(gray, (31, 31), 0) + + # if the first frame is None, initialize it + if firstFrame is None: + firstFrame = gray + continue + + # compute the absolute difference between the current frame and + # first frame + frameDelta = cv2.absdiff(gray, firstFrame) + + thresh = cv2.threshold(frameDelta, threashold, 255, cv2.THRESH_BINARY)[1] + + # dilate the thresholded image to fill in holes, then find contours + # on thresholded image + thresh = cv2.dilate(thresh, None, iterations=2) + cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + cnts = imutils.grab_contours(cnts) + + # loop over the contours + for c in cnts: + # if the contour is too small, ignore it + if cv2.contourArea(c) < args["min_area"]: + continue + if cv2.contourArea(c) > args["max_area"]: + continue + # compute the bounding box for the contour, draw it on the frame, + # and update the text + + print(cv2.contourArea(c)) + + (x, y, w, h) = cv2.boundingRect(c) + cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) + text = "Occupied" + + # draw the text and timestamp on the frame + cv2.putText(frame, "Room Status: {}".format(text), (10, 20), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) + cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"), + (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1) + + if text == "Occupied": + img = frame + location = mon.saveImage(img) + mon.notify(location) + + key = cv2.waitKey(1) & 0xFF + + counter+=1 + if counter % (framerate * delay) == 0: + firstFrame = gray + except: + # cleanup the camera and close any open windows + vs.stop() if args.get("video", None) is None else vs.release() + print("error") + time.sleep(10) + + + + +compare("http://192.168.178.25:8000/stream.mjpg") \ No newline at end of file