Jun-05-2019, 01:01 PM
@Gribouillis I tried your suggested method but received a syntax error message. Any thoughts on that?
@perfringo yes, that's probably the issue which is why I'm seeking help. Any helpful suggestion?
@buran my opencv dual USB camera motion detection module code is below-
Module 1 (main USB camera executable):
@perfringo yes, that's probably the issue which is why I'm seeking help. Any helpful suggestion?
@buran my opencv dual USB camera motion detection module code is below-
Module 1 (main USB camera executable):
# import the necessary packages from __future__ import print_function from pyimagesearch.basicmotiondetector import BasicMotionDetector from imutils.video import VideoStream from send_mail import send_mail import numpy as np import datetime import imutils import time import cv2 # initialize the video streams and allow them to warmup print("[INFO] starting cameras...") webcam1 = VideoStream(src=0).start() webcam2 = VideoStream(src=4).start()#src 0,2,4 work time.sleep(2.0) # initialize the two motion detectors, along with the total # number of frames read camMotion1 = BasicMotionDetector() camMotion2 = BasicMotionDetector() total = 0 # loop over frames from the video streams while True: # initialize the list of frames that have been processed frames = [] # loop over the frames and their respective motion detectors for (stream, motion) in zip((webcam1, webcam2), (camMotion1, camMotion2)): # read the next frame from the video stream and resize # it to have a maximum width of 400 pixels frame = stream.read() frame = imutils.resize(frame, width=400) # convert the frame to grayscale, blur it slightly, update # the motion detector gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (21, 21), 0) locs = motion.update(gray) # we should allow the motion detector to "run" for a bit # and accumulate a set of frames to form a nice average if total < 32: frames.append(frame) continue # otherwise, check to see if motion was detected if len(locs) > 0: # initialize the minimum and maximum (x, y)-coordinates, # respectively (minX, minY) = (np.inf, np.inf) (maxX, maxY) = (-np.inf, -np.inf) # loop over the locations of motion and accumulate the # minimum and maximum locations of the bounding boxes for l in locs: (x, y, w, h) = cv2.boundingRect(l) (minX, maxX) = (min(minX, x), max(maxX, x + w)) (minY, maxY) = (min(minY, y), max(maxY, y + h)) # draw the bounding box cv2.rectangle(frame, (minX, minY), (maxX, maxY), (0, 0, 255), 3) send_mail(frame=frame) # update the frames list frames.append(frame) # increment the total number of frames read and grab the # current timestamp total += 1 timestamp = datetime.datetime.now() ts = timestamp.strftime("%Y-%m-%d %H:%M:%S.%f") # loop over the frames a second time for (frame, name) in zip(frames, ("Webcam1", "Webacm2")): # draw the timestamp on the frame and display it cv2.putText(frame, ts, (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1) cv2.imshow(name, frame) # check to see if a key was pressed key = cv2.waitKey(1) & 0xFF # if the `q` key was pressed, break from the loop if key == ord("q"): break # do a bit of cleanup print("[INFO] cleaning up...") cv2.destroyAllWindows() webcam1.stop() webcam2.stop()Module 2 (email module after motion is detected)-
# STANDARD LIBRARY IMPORTS import smtplib from datetime import datetime, timedelta from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import os import sys # THIRD PARTY IMPORTS import cv2 # gmail must be set to allow less secure apps, so you can send emails. # set it up on: # https://myaccount.google.com/u/1/lesssecureapps?pli=1 def send_mail(frame): path = os.path.dirname(sys.argv[0]) log_file = path + '/email.log' # Check if the last email was sent in an 1 minute tolerance. # We are going to use a .log file to keep track of it. if os.path.isfile(log_file): # First check if file exists. with open(log_file, 'r') as f: date = f.read() date_to_datetime = datetime.strptime(date, "%Y-%m-%d %H:%M:%S.%f") if datetime.now() < date_to_datetime + timedelta(minutes=1): return # Update the email log. with open(log_file, 'w') as f: f.write(str(datetime.now())) # Create the jpg picture to attach. cv2.imwrite("project/intrude.jpg", frame) gmail_user = 'my_email' gmail_password = 'password' recipient = 'to_email' message = 'Hey! It appears that someone is at home!!!' msg = MIMEMultipart() msg['From'] = gmail_user msg['To'] = recipient msg['Subject'] = "Someone is at Home!" msg.attach(MIMEText(message)) # Attachment file = path + '/intrude.jpg' filename = 'intrude.jpg' attachment = open(file, "rb") part = MIMEBase('application', 'octet-stream') part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', "attachment; filename= %s" % filename) msg.attach(part) mail_server = smtplib.SMTP('smtp.gmail.com', 587) mail_server.ehlo() mail_server.starttls() mail_server.ehlo() mail_server.login(gmail_user, gmail_password) mail_server.sendmail(gmail_user, recipient, msg.as_string()) mail_server.close()