Esempio n. 1
0
 def __init__(self, verbose=False):
     self.verbose = verbose
     self.camera_mode = self.STATE_DETECTION
     self.web_connection = WebConnection(self, verbose)
     self.video = Video(self, verbose)
     self.external_camera = ExternalCamera(self, verbose)
     self.motion_detector = MotionDetector(self, verbose)
     self.send_video = False
     self.status_counter = 0
     self.motion_limit = self.MOTION_UPPER_LIMIT
     # Have one camera and share it between motiondetector and video comp
     # Errors - if both try to create camera
     self.camera = picamera.PiCamera()
Esempio n. 2
0
    def __init__(self):
        self.showWindows = None
        self.parseArguments()
        self.settings = SettingsManager()
        self.motiondetector = MotionDetector(threshold=0.2,
                                             showWindows=self.showWindows)
        self.apiClient = ApiClient()
        self.motion = False
        self.timer = None
        self.onTimer = Timer(7.0, self.resetOnTimer)
        self.cameraId = None
        self.motionScore = 0.0

        self.initializeApp()
Esempio n. 3
0
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.setFixedSize(self.size())

        # obtain dim of elements
        self.triggerGroupDim = [
            self.triggerGroup.geometry().width(),
            self.triggerGroup.geometry().height()
        ]
        self.recordButtonDim = [
            self.recordButton.geometry().width(),
            self.recordButton.geometry().height()
        ]
        self.filepathTextDim = [
            self.filepathText.geometry().width(),
            self.filepathText.geometry().height()
        ]

        # Livefeed tab:
        self.window_width = self.live_display.frameSize().width()
        self.window_height = self.live_display.frameSize().height()
        self.live_display.setStyleSheet("QLabel { background-color : black}")

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(1)

        self.datetimeTagLocation = (10, 30)
        self.datetimeTagColour = (0, 255, 0)

        # Recorder object
        self.record = Recorder(CAM_WIDTH, CAM_HEIGHT, CAM_FPS)
        self.recordButton.clicked.connect(self.record_to)
        self.timetracker = -1

        self.subjectCheck.stateChanged.connect(self.record_on_detection)
        self.recordOnPresence = False
        self.inactiveCount = 0
        self.isDetected = False

        self.motionCheck.stateChanged.connect(self.record_on_motion)
        self.recordOnMotion = False
        self.isMoving = False
        self.noMotionCount = 0

        self.motionTagLocation = (CAM_WIDTH - 300, 30)
        self.motionTagColour = (0, 0, 255)

        # Detector object
        self.detector = SSD_Detector()
        if not self.detector.ready:
            self.subjectCheck.setEnabled(False)

        # Motion detector object
        self.motiondetect = MotionDetector()

        # email alert module
        self.emailsender = EmailSender()
        self.sendOnActivity = False
        self.sendoutStartTime = -1

        self.emailsetupButton.clicked.connect(self.emailAlertSetup)
        self.testemailButton.clicked.connect(self.emailSendTest)
        self.sendemailCheck.stateChanged.connect(self.emailSendToggleFunc)
        self.password_input.setEchoMode(QtWidgets.QLineEdit.Password)
        self.port_input.setValidator(QtGui.QIntValidator(0, 999))

        if self.emailsender.getSetupFlag():
            email_address, email_password, smtp, port = self.emailsender.getLoginDetails(
            )
            self.email_input.setText(email_address)
            self.password_input.setText(email_password)
            self.smtp_input.setText(smtp)
            self.port_input.setText(str(port))

            # Disable user interface
            self.emailGroup.setEnabled(False)
            self.testemailButton.setEnabled(True)
            self.sendemailCheck.setEnabled(True)
            self.emailsetupButton.setText("Change")
Esempio n. 4
0
class MyWindowClass(QtWidgets.QMainWindow, form_class):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.setFixedSize(self.size())

        # obtain dim of elements
        self.triggerGroupDim = [
            self.triggerGroup.geometry().width(),
            self.triggerGroup.geometry().height()
        ]
        self.recordButtonDim = [
            self.recordButton.geometry().width(),
            self.recordButton.geometry().height()
        ]
        self.filepathTextDim = [
            self.filepathText.geometry().width(),
            self.filepathText.geometry().height()
        ]

        # Livefeed tab:
        self.window_width = self.live_display.frameSize().width()
        self.window_height = self.live_display.frameSize().height()
        self.live_display.setStyleSheet("QLabel { background-color : black}")

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.update_frame)
        self.timer.start(1)

        self.datetimeTagLocation = (10, 30)
        self.datetimeTagColour = (0, 255, 0)

        # Recorder object
        self.record = Recorder(CAM_WIDTH, CAM_HEIGHT, CAM_FPS)
        self.recordButton.clicked.connect(self.record_to)
        self.timetracker = -1

        self.subjectCheck.stateChanged.connect(self.record_on_detection)
        self.recordOnPresence = False
        self.inactiveCount = 0
        self.isDetected = False

        self.motionCheck.stateChanged.connect(self.record_on_motion)
        self.recordOnMotion = False
        self.isMoving = False
        self.noMotionCount = 0

        self.motionTagLocation = (CAM_WIDTH - 300, 30)
        self.motionTagColour = (0, 0, 255)

        # Detector object
        self.detector = SSD_Detector()
        if not self.detector.ready:
            self.subjectCheck.setEnabled(False)

        # Motion detector object
        self.motiondetect = MotionDetector()

        # email alert module
        self.emailsender = EmailSender()
        self.sendOnActivity = False
        self.sendoutStartTime = -1

        self.emailsetupButton.clicked.connect(self.emailAlertSetup)
        self.testemailButton.clicked.connect(self.emailSendTest)
        self.sendemailCheck.stateChanged.connect(self.emailSendToggleFunc)
        self.password_input.setEchoMode(QtWidgets.QLineEdit.Password)
        self.port_input.setValidator(QtGui.QIntValidator(0, 999))

        if self.emailsender.getSetupFlag():
            email_address, email_password, smtp, port = self.emailsender.getLoginDetails(
            )
            self.email_input.setText(email_address)
            self.password_input.setText(email_password)
            self.smtp_input.setText(smtp)
            self.port_input.setText(str(port))

            # Disable user interface
            self.emailGroup.setEnabled(False)
            self.testemailButton.setEnabled(True)
            self.sendemailCheck.setEnabled(True)
            self.emailsetupButton.setText("Change")

    def emailSendToggleFunc(self):
        if self.sendemailCheck.isChecked():
            self.sendOnActivity = True
        else:
            self.sendOnActivity = False
            self.sendoutStartTime = -1

    def emailSendTest(self):
        if self.emailsender.getSetupFlag():
            self.emailsender.send_testmsg()

    def emailAlertSetup(self):
        if self.emailsetupButton.text() == "Setup":
            if not self.emailsender.getSetupFlag():
                email_address = self.email_input.text()
                email_password = self.password_input.text()
                smtp = self.smtp_input.text()
                port = self.port_input.text()

                # simple check to evaluate input validity
                check_email_pattern = re.compile('[^@]+@[^@]+\.[^@]+')
                if not check_email_pattern.match(email_address):
                    self.err_email_label.setText("Invalid Email")
                else:
                    self.err_email_label.setText("")
                    self.emailsender.login_setup(email_address, email_password,
                                                 smtp, int(port))

                    if self.emailsender.getSetupFlag():

                        # If successfully logged in
                        self.emailGroup.setEnabled(False)
                        self.testemailButton.setEnabled(True)
                        self.sendemailCheck.setEnabled(True)
                        self.emailsetupButton.setText("Change")
                    else:
                        # authentication failed
                        self.err_email_label.setText("Authentication Failed!")
        else:
            self.emailsender.close_connection()
            self.emailGroup.setEnabled(True)
            self.testemailButton.setEnabled(False)
            self.sendemailCheck.setEnabled(False)
            self.emailsetupButton.setText("Setup")

    def emailSendTracker(self, isDetected):
        currentDateTime = QtCore.QTime.currentTime().toString(
            QtCore.Qt.DefaultLocaleLongDate).split()
        currentDayLight = currentDateTime[1]
        currentTime = currentDateTime[0].split(':')
        currentTimeSeconds = int(currentTime[0]) * 3600 + int(
            currentTime[1]) * 60 + int(currentTime[2])

        if isDetected:
            if self.sendoutStartTime == -1:  # initialize
                # send out first email here
                print("Activity started: Send out first email")
                self.emailsender.send_emailalert(True, currentTimeSeconds,
                                                 currentDayLight)

            self.sendoutStartTime = currentTimeSeconds
        else:
            # invoke timeout sequence (2 mins of inactivity, send out last email)
            if self.sendoutStartTime > -1:

                if currentTimeSeconds - self.sendoutStartTime > RECORD_INTERVAL:

                    print("Activity ended: Send out last email")
                    self.emailsender.send_emailalert(False, currentTimeSeconds,
                                                     currentDayLight)

                    self.sendoutStartTime = -1

    def resizeEvent(self, event):
        # readjust ui according to window size
        # MainWindow.textEdit.setGeometry(QtCore.QRect(30, 80, 341, 441))

        curr_mainframe_w = self.frameSize().width()
        curr_mainframe_h = self.frameSize().height()

        # Adjust tab widget size
        fixed_tab_x = self.tabWidget.geometry().x()
        fixed_tab_y = self.tabWidget.geometry().y()
        new_tab_w = curr_mainframe_w - 40
        new_tab_h = curr_mainframe_h - 80

        self.tabWidget.resize(new_tab_w, new_tab_h)

        # **** Set all elements relative to tabWidget_relativeSizeRatio ****

        # set triggerGroup Pos:
        new_trigger_x = fixed_tab_x + (new_tab_w - self.triggerGroupDim[0] -
                                       40)
        new_trigger_y = fixed_tab_y
        self.triggerGroup.move(new_trigger_x, new_trigger_y)

        # set recordButton Pos:
        new_recordbtn_x = fixed_tab_x + (new_tab_w / 2 -
                                         self.recordButtonDim[0])
        new_recordbtn_y = fixed_tab_y + (new_tab_h - self.recordButtonDim[1] -
                                         80)
        self.recordButton.move(new_recordbtn_x, new_recordbtn_y)

        # set filePath Pos:
        new_filepath_x = fixed_tab_x
        new_filepath_y = new_recordbtn_y - self.filepathTextDim[1] - 20
        self.filepathText.move(new_filepath_x, new_filepath_y)

        # finally set the display size
        self.window_width = new_trigger_x - 40
        self.window_height = new_filepath_y - 40
        self.live_display.resize(self.window_width, self.window_height)

    def record_to(self):

        if self.record.getPreDefinedFilePath() == "undefined":
            # return filepath where video is saved
            dir_ = QtWidgets.QFileDialog.getExistingDirectory(
                None, 'Select a folder for record output:', '~/',
                QtWidgets.QFileDialog.ShowDirsOnly)

            if len(dir_) > 0:
                self.record.setPreDefinedFilePath(dir_)
                self.filepathText.setText('Saving video to: ' + dir_)
            else:
                self.record.setPreDefinedFilePath("undefined")

        else:
            if self.record.getRecordingStatus():
                # stop recording
                self.record.turnOffRecording()
                self.recordButton.setText('Record')
            else:
                self.record.invokeRecording()

                if self.record.getRecordingStatus():
                    self.recordButton.setText('Stop')

    def record_on_detection(self):
        if self.subjectCheck.isChecked():
            self.recordOnPresence = True
        else:
            self.recordOnPresence = False

    def record_on_motion(self):
        if self.motionCheck.isChecked():
            self.recordOnMotion = True
        else:
            self.recordOnMotion = False

    def recordTriggerFunc(self, frame):
        # record on presence only
        if self.recordOnPresence and not self.recordOnMotion:
            if self.isDetected:

                if self.inactiveCount >= RECORD_INTERVAL:  # estimate 2 sec of detect nothing
                    self.record.invokeRecording()  #reinitalize

                self.record.vidWriter.write(frame)
                self.inactiveCount = 0
            else:

                if self.inactiveCount < RECORD_INTERVAL:
                    self.inactiveCount += 1
                else:
                    self.record.killRecorder()

        elif self.recordOnMotion and not self.recordOnPresence:
            if self.isMoving:
                if self.noMotionCount >= RECORD_INTERVAL:
                    self.record.invokeRecording()

                self.record.vidWriter.write(frame)
                self.noMotionCount = 0
            else:
                if self.noMotionCount < RECORD_INTERVAL:
                    self.noMotionCount += 1
                else:
                    self.record.killRecorder()

        elif self.recordOnMotion and self.recordOnPresence:
            if self.isDetected or self.isMoving:
                if self.inactiveCount >= RECORD_INTERVAL and self.noMotionCount >= RECORD_INTERVAL:
                    self.record.invokeRecording()
                self.record.vidWriter.write(frame)
                self.inactiveCount = 0
                self.noMotionCount = 0
            else:
                assessOne = False
                assessTwo = False

                if self.noMotionCount < RECORD_INTERVAL:
                    self.noMotionCount += 1
                else:
                    assessOne = True
                if self.inactiveCount < RECORD_INTERVAL:
                    self.inactiveCount += 1
                else:
                    assessTwo = True

                if assessOne and assessTwo:
                    self.record.killRecorder()
        else:
            # Record everything in interval of 2 minutes
            if self.timetracker == -1:
                self.timetracker = self.record.getCurrentTime()
            else:
                ref_hr, ref_min, ref_sec, _ = self.timetracker.split('_')
                refTimeInSeconds = int(ref_min) * 60 + int(ref_sec)

                cur_hr, cur_min, cur_sec, _ = self.record.getCurrentTime(
                ).split('_')
                curTimeInSeconds = int(cur_min) * 60 + int(cur_sec)

                if curTimeInSeconds - refTimeInSeconds >= RECORD_INTERVAL:
                    self.record.invokeRecording()
                    self.timetracker = self.record.getCurrentTime()

            self.record.vidWriter.write(frame)

    def drawOnFrame(self, inputImg, isMotion):
        # Tag date
        cv2.putText(inputImg, self.record.getDisplayLabel(),
                    self.datetimeTagLocation, cv2.FONT_HERSHEY_SIMPLEX, 1,
                    self.datetimeTagColour, 2, cv2.LINE_AA)

        # Tag motion indicator
        if isMotion:
            cv2.putText(inputImg, "Motion Detected!", self.motionTagLocation,
                        cv2.FONT_HERSHEY_SIMPLEX, 1, self.motionTagColour, 2,
                        cv2.LINE_AA)

    def displayFrame(self, img):
        img_height, img_width, img_colors = img.shape

        scale_w = float(self.window_width) / float(img_width)
        scale_h = float(self.window_height) / float(img_height)
        scale = min([scale_w, scale_h])

        if scale == 0:
            scale = 1

        img = cv2.resize(img,
                         None,
                         fx=scale,
                         fy=scale,
                         interpolation=cv2.INTER_CUBIC)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        height, width, bpc = img.shape
        bpl = bpc * width
        image = QtGui.QImage(img.data, width, height, bpl,
                             QtGui.QImage.Format_RGB888)
        pix = QtGui.QPixmap(image)
        self.live_display.setPixmap(pix)

    # Live Mode
    def update_frame(self):
        if not q.empty():

            # UI thingy
            self.recordButton.setEnabled(True)

            # grab frame from video thread
            try:
                frame = q.get()
                img = frame["img"]
            except:
                print("error obtaining images")
            else:
                # detect motion
                if self.recordOnMotion:
                    # detect motion
                    motionImg = img.copy()
                    self.isMoving = self.motiondetect.detectmotion(motionImg)
                else:
                    self.isMoving = False

                # detect presence
                if self.recordOnPresence:
                    # detect objects and indicate on display
                    img, self.isDetected = self.detector.process_image(img)
                else:
                    self.isDetected = False

                if self.sendOnActivity:
                    if self.isMoving or self.isDetected:
                        self.emailSendTracker(True)
                    else:
                        self.emailSendTracker(False)

                # Tag the frame with indications
                self.drawOnFrame(img, self.isMoving)

                if self.record.getRecordingStatus():
                    self.recordTriggerFunc(img)

                # show frame with annotation
                self.displayFrame(img)

    def closeEvent(self, event):
        global cam_running
        cam_running = False
        self.record.killRecorder()
Esempio n. 5
0
vlc = VLCRemote()
command = ""

with open('credentials.txt', 'r') as f:
    cred = json.load(f)

try:
    vlc.login(cred['port'], cred['password'])
except Exception as e:
    raise e
    sys.exit(1)

# unpack the hand ROI, then initialize the motion detector and gesture detector
(top, right, bot, left) = np.int32("10,350,225,590".split(","))
gd = GestureDetector()
md = MotionDetector()

# initialize the total number of frames read thus far, a bookkeeping variable used to
# keep track of the number of consecutive frames a gesture has appeared in, along
# with the values recognized by the gesture detector
numFrames = 0
fingerDeque = deque(maxlen=10)
fingerDeque.appendleft(32)

# keep looping
while True:
    # grab the current frame
    (grabbed, frame) = camera.read()

    numFrames += 1
    # resize the frame and flip it so the frame is no longer a mirror view
Esempio n. 6
0
import datetime

import cv2
import pandas as pandas
from camera import Camera
from graph_maker import GraphMaker
from motiondetector import MotionDetector
from display import Display


motion_detector = MotionDetector()
camera = Camera(1)
motion_detector.attachCamera(camera)
motion_detector.startCamera()
display = Display()
motion_detector.attachDisplay(display)
df = pandas.DataFrame(columns=["Start", "End"])

motion_detector.startDetecting()

print(motion_detector.times)

for i in range(0, len(motion_detector.times), 2):
    df=df.append({"Start": motion_detector.times[i], "End": motion_detector.times[i+1]}, ignore_index=True)

df.to_csv("Times.csv")


p = GraphMaker.generateQuadGraphDatetime(df)

Esempio n. 7
0
class Start:
    def __init__(self):
        self.showWindows = None
        self.parseArguments()
        self.settings = SettingsManager()
        self.motiondetector = MotionDetector(threshold=0.2,
                                             showWindows=self.showWindows)
        self.apiClient = ApiClient()
        self.motion = False
        self.timer = None
        self.onTimer = Timer(7.0, self.resetOnTimer)
        self.cameraId = None
        self.motionScore = 0.0

        self.initializeApp()

    def initializeApp(self):
        self.cameraId = self.apiClient.activateNewSensor()
        self.motiondetector.run(self.motionDetected)

    def parseArguments(self):
        parser = argparse.ArgumentParser(
            description="Bartimeus argument parser.")
        parser.add_argument("-w",
                            "--windows",
                            required=False,
                            help="Show windows with motion results.")
        args = parser.parse_args()

        if args.windows:
            print(args.windows)
            if int(args.windows) == 1:
                print('true')
                self.showWindows = True
            else:
                self.showWindows = False
        else:
            self.showWindows = False

    def turnOffRoom(self):
        print('timer afgelopen!')
        self.apiClient.updateAvailability(self.cameraId, False)
        self.motionScore = 0.0
        self.motion = False

    def turnOnRoom(self):
        print('turning on')
        self.apiClient.updateAvailability(self.cameraId, True)

        return None

    def resetOnTimer(self):
        self.motionScore = 0.0
        if self.onTimer != None:
            self.onTimer.cancel()

        self.onTimer = Timer(7, self.resetOnTimer)
        self.onTimer.start()

        print('Reset onTimer')

    def motionDetected(self, value):
        self.motionScore += value
        print("Motion score: ", self.motionScore)
        if self.motionScore > 90:
            self.resetOnTimer()
            if self.motion == False:
                self.turnOnRoom()
                self.motion = True

            if self.timer != None:
                self.timer.cancel()

            self.timer = Timer(7.0, self.turnOffRoom)
            self.timer.start()
Esempio n. 8
0
class Brainz:
    STATE_DETECTION = 1
    STATE_MANUAL = 2
    MOTION_UPPER_LIMIT = 40
    STATUS_REPORT_TICKS = 50
    TICK_INTERVAL = 0.1

    def __init__(self, verbose=False):
        self.verbose = verbose
        self.camera_mode = self.STATE_DETECTION
        self.web_connection = WebConnection(self, verbose)
        self.video = Video(self, verbose)
        self.external_camera = ExternalCamera(self, verbose)
        self.motion_detector = MotionDetector(self, verbose)
        self.send_video = False
        self.status_counter = 0
        self.motion_limit = self.MOTION_UPPER_LIMIT
        # Have one camera and share it between motiondetector and video comp
        # Errors - if both try to create camera
        self.camera = picamera.PiCamera()

    def __print(self, str):
        if self.verbose:
            print(str)

    def start(self):
        # If you dont want/have some module - just remove start method

        self.web_connection.start()
        self.external_camera.start()
        self.motion_detector.start()
        # self.video.start()
        self.__print('Brainz warming up')

        time.sleep(1)
        self.web_connection.send_message("Camera bot started")

        try:
            while True:
                self.tick()
        finally:
            self.web_connection.stop()
            self.video.stop()
            self.external_camera.stop()
            self.motion_detector.stop()
            self.__print('Brainz died')

    def camera_mode_changed(self, new_state):
        print("STATE CHANGED")
        self.camera_mode = new_state
        if new_state == self.STATE_DETECTION:
            print("Stop video")
            self.video.stop()
            time.sleep(1)
            print("Start detector")
            self.motion_detector.start()
            print("Ok")
            time.sleep(1)
        else:
            print("Stop detector")
            self.motion_detector.stop()
            time.sleep(1)
            print("Start video")
            self.video.start()
            print("ok")
            time.sleep(1)

    def tick(self):
        try:
            interval = self.TICK_INTERVAL
            self.external_camera.tick(interval)
            self.video.tick(interval)
            self.web_connection.tick(interval)
            self.status_counter += 1
            # Send status report to websocket server
            if self.status_counter > self.STATUS_REPORT_TICKS:
                self.web_connection.send_status()
                self.status_counter = 0
            time.sleep(self.TICK_INTERVAL)
        except:
            self.__print("Unexpected error 1:")
            self.__print(sys.exc_info()[0])
            raise