From 148d88c91e346a53d6dc476b1ae599cfafa37c27 Mon Sep 17 00:00:00 2001 From: Kshitij Date: Fri, 18 Oct 2024 14:22:24 +0530 Subject: [PATCH] added main code. --- main.py | 54 +++++++++++++++++++++++++++++++++++++ motion_detection.py | 66 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 main.py create mode 100644 motion_detection.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..d86eff7 --- /dev/null +++ b/main.py @@ -0,0 +1,54 @@ +import cv2 +import requests +import time + +# Set up camera +cap = cv2.VideoCapture(0) + +# Initialize variables for motion detection +ret, frame1 = cap.read() +ret, frame2 = cap.read() + +# URL for ntfy.sh +ntfy_url = "ntfy.sh/K3R3wHq4w9mwcwNd" + +def send_notification(): + payload = { + 'title': 'Motion Detected', + 'message': 'Motion detected by Raspberry Pi camera!', + 'priority': 'high' + } + try: + response = requests.post(ntfy_url, json=payload) + if response.status_code == 200: + print("Notification sent successfully.") + else: + print("Failed to send notification.") + except Exception as e: + print(f"An error occurred: {e}") + +while cap.isOpened(): + # Compute difference between two frames + diff = cv2.absdiff(frame1, frame2) + gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) + blur = cv2.GaussianBlur(gray, (5, 5), 0) + _, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY) + dilated = cv2.dilate(thresh, None, iterations=3) + contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + + for contour in contours: + if cv2.contourArea(contour) < 5000: + continue + send_notification() + time.sleep(10) # Wait for 10 seconds before sending another notification + + frame1 = frame2 + ret, frame2 = cap.read() + + # Press 'q' to exit the loop + if cv2.waitKey(10) & 0xFF == ord('q'): + break + +cap.release() +cv2.destroyAllWindows() + diff --git a/motion_detection.py b/motion_detection.py new file mode 100644 index 0000000..863b1e5 --- /dev/null +++ b/motion_detection.py @@ -0,0 +1,66 @@ +import cv2 +import numpy as np +import os +import time +import requests + +# Function to send notification using notify.sh +def send_notification(): + url = "http://:/notify" # Replace with your Raspberry Pi's IP and port + payload = { + "title": "Motion Detected!", + "message": "Motion has been detected by the camera." + } + headers = { + "Authorization": "Bearer " # Replace with your API token + } + + try: + response = requests.post(url, json=payload, headers=headers) + if response.status_code == 200: + print("Notification sent successfully!") + else: + print("Failed to send notification:", response.status_code, response.text) + except Exception as e: + print("Error sending notification:", e) + +# Initialize the camera +cap = cv2.VideoCapture(0) + +# Read the first frame +ret, frame1 = cap.read() +ret, frame2 = cap.read() + +while True: + # Calculate the difference between the frames + diff = cv2.absdiff(frame1, frame2) + gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) + blur = cv2.GaussianBlur(gray, (5, 5), 0) + _, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY) + dilated = cv2.dilate(thresh, None, iterations=3) + + # Find contours + contours, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + + # Check for motion + for contour in contours: + if cv2.contourArea(contour) < 500: # Adjust the threshold as needed + continue + send_notification() + break # Exit after sending notification + + # Update frames + frame1 = frame2 + ret, frame2 = cap.read() + + # Display the video feed (optional) + cv2.imshow("Motion Detection", frame1) + + # Break the loop on 'q' key press + if cv2.waitKey(1) == ord('q'): + break + +# Release the camera and close windows +cap.release() +cv2.destroyAllWindows() +