Ask Your Question

Revision history [back]

How can i set a automatic video recorder

I have a video stream i want it to start recording when it detects an object and stop when there is no one around and save it while its recording it is also taking photo of the stream. Than send it all to dropbox so far i have been able to to all except the "start recording when it detects an object and stop when there is no one around".
Is there anything i can do to make it work?

Im working with python, linux OS , webcam
The below is my code :

import sys
sys.path.append('/usr/local/lib/python3.4/site-packages')
import numpy as np
import cv2
import imutils
from imutils import contours
import datetime
import time
import dropbox


dbx = dropbox.Dropbox('-------------------------------------------------')
dbx.users_get_current_account()


#cap = cv2.VideoCapture("/home/pi/Desktop/Proj/VideoTestSample.mp4")
cap = cv2.VideoCapture(1)

fgbg = cv2.createBackgroundSubtractorMOG2()

#Set format
fourcc = cv2.VideoWriter_fourcc(*'XVID')
#Get Datetime
timestr = time.strftime("%Y_%m_%d_%H_%M_%S")
#Creating name of folder
timestr = timestr + '.avi'
#Setting Name, Format, FPS, FrameSize
out = cv2.VideoWriter(timestr,fourcc, 20.0, (640,480))

#As long as the VideoCapture is open loop to show the frames
while (cap.isOpened()):
    #capture frame-by-frame
    (grabbed, frame) = cap.read()
    text = " "

    if not grabbed:
        break

    #Blur the image as in remove noise 
    frame = cv2.medianBlur(frame, 5)
    #Convert frame to Black white and gray
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)


    #Apply the Background SubtractionMOG2
    fgmask = fgbg.apply(gray)
    #Erode away the boundaries of the foreground object
    thresh = cv2.erode(fgmask, None, iterations=2)

    #Set detect as none
    detect = None

    #Find outline of a new foreground object from thresh after the erossion
    (_,cnts,hierarchy) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    #detect is object found or not found
    detect = (_,cnts,hierarchy)

    #if object found is detected run these codes
    if detect == (_,cnts,hierarchy):

        #if area of object is lower than 300 ignore it 
        for (i,c) in enumerate(cnts):
            if cv2.contourArea(c) < 300:
                continue

            #Draw Rectangle around found contour object
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
            #Draw number of object above the rectangle
            cv2.putText(frame, "#{}".format(i + 1), (x, y - 15),
                cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
            text = "REC"


            #Capture image
            print("Capturing frame")
            timestring = time.strftime("%Y_%m_%d_%H_%M_%S")
            image_timestr = 'image_' + timestring + '.png'
            cv2.imwrite(image_timestr, frame)

            #Opening for [r]eading as [b]inary
            ImageFile = open(image_timestr, mode = "rb")
            #Reads the number of bytes of the video
            data = ImageFile.read()

            #Setting the save location with file name
            SavetoLocation = '/FYP_Image_Save/'+ image_timestr
            SaveToLocation = str(SavetoLocation)

            detect= None 

            if detect != (_,cnts,hierarchy):
                print("Stop recording")

    elif  detect != (_,cnts,hierarchy):
        print("Not recording")

    else:
        continue

    #Draw the text at top right hand corner
    cv2.putText(frame, "{}". format(text), (10,20),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
    #Draw the DateTime on the bottom left hand corner
    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)

    #Write which window into video in this case Frame
    out.write(frame) 
    #Display the following windows
    cv2.imshow('frame',frame)
    cv2.imshow('gray', gray)
    cv2.imshow('fgmask', fgmask)


    #Upload the image file
    print("Sending image to Dropbox")
    dbx.files_upload(data, SaveToLocation)
    #Close for reading and binary
    ImageFile.close()    


    #if q is pressed break loop
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

#Stop recording 
out.release()
#Kill all windows
cap.release()
cv2.destroyAllWindows()



#Opening for [r]eading as [b]inary
VideoFile = open(timestr, mode = "rb")
#Reads the number of bytes of the video
data = VideoFile.read()

#Setting the save location with file name
SavetoLocation = '/FYP_Video_Save/'+timestr
SaveToLocation = str(SavetoLocation)

#Upload the file
print("Sending to Dropbox")
dbx.files_upload(data, SaveToLocation)
#Close for reading and binary
VideoFile.close()