@
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):
# 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()