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 __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 __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")
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()
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
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)
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()
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