I wanted to get a text when someone comes to my front door. I know you can buy a commercial camera that does this, but I wanted more control over the images. My garage has a window that faces the front door of my house, so I didn't have to build a weatherproof enclosure.
The system has a smart cam that detects people and notifies the Raspberry Pi when one is the the frame. A python program on the Raspberry Pi writes the Jpeg to a file and uploads it to Google Drive. The program then uses Twilio to send a text with a link to the photo to my cell phone.
I am using a Jevois smart camera and a Raspberry Pi. The Jevois camera is an open source smart cam that runs Linux and has a number of built in modules and costs about $50. I've previously tried to do image recognition using just a webcam on a Raspberry Pi, but the performance wasn't good.
The Jevois comes in a small 3D printed case with a mini-USB connector on the back. I used a piece of scrap MDF to make a base. I initially wanted to use the Jevois on a tripod so I cut a hole and glued a 1/4-20 nut in the MDF. I screwed the Jevois to the MDF with the suggested screws. The holes in the case aren't tapped so it's a little tricky.
To make a stable base, I took the small cardboard box that the Jevois was shipped in, cut a small hole in the top and glued a 1/4-20 bolt in the top. When the glue was dry, I filled the box with sand and screwed the Jevois on to the box.
For the computer, I used a Raspberry Pi 3B that I had from a previous project and I connected the Jevois via USB. One thing to note, The Raspberry Pi doesn't provide enough power to reliably power the Jevois via the USB port. Jevois sells a pigtail USB that has two standard USB connections - one for data, and one for power - connected to a mini-USB. I used one of these with the data connection going to the PI and the power going to a USB power adapter/wall charger.
The Jevois cam has YOLO as one of the bundled machine vision modules. I've had success with it previously, so I just used the stock version.
On the Raspberry Pi, the following code controls the camera, saves the image when a person is detected, copies it to Google Drive and texts me.
#!/usr/bin/python3 TWaccount_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' TWauth_token = 'lotsarandomchars' import os,sys import time import shutil import cv2 import numpy import serial import logging from datetime import datetime from twilio.rest import Client import uploader def SendParm(cmd): ser.write (cmd) time.sleep(1) line = ser.readline() if Headless: logging.info(cmd.decode('utf8')) logging.info(line.decode('utf8')) else: print (cmd.decode('utf8')) print (line.decode('utf8')) #main ------- Headless=True #default to not headless when debugging in Idle if 'idlelib.run' in sys.modules: #idle Headless=False thresh=50 # default detection threshold if len(sys.argv)>1: if sys.argv=='-show': Headless=False elif 'thresh' in sys.argv: thresh_arg=sys.argv.split("=") thresh=int(thresh_arg) if len(sys.argv)>2: if 'thresh' in sys.argv: thresh_arg=sys.argv.split("=") thresh=int(thresh_arg) if os.name == 'nt': folder = 'C:\\users\\peter/jevois_capture' logfile = 'c:\\users\\peter/jevois.log' cfg_path = 'c:/Users/peter/frontdoorcam/uploader.cfg' port = 'COM7' camno = 0 else: #linux folder = '/home/pi/jevois_capture' logfile = '/home/pi/jevois.log' cfg_path = '/home/pi/frontdoorcam/uploader.cfg' port = '/dev/ttyACM0' camno = 0 logging.basicConfig(filename=logfile,level=logging.DEBUG) logging.info('------- Jevois Cam Startup --------') ser = serial.Serial(port,115200,timeout=0.01) # No windows in headless if not Headless: cv2.namedWindow("jevois", cv2.WINDOW_NORMAL) cv2.resizeWindow("jevois",1280,480) camera = cv2.VideoCapture(camno) #initialize the jevois...Read more »