From 1d4ecdaa345ede8fbe487cd46d304ca74006f2d3 Mon Sep 17 00:00:00 2001 From: James Hodgson Date: Sat, 26 Dec 2020 16:36:49 +0000 Subject: [PATCH] Move to using classes --- src/main.py | 36 +++++++++++++++++++++++ src/picam.py | 44 +++++++++++++++++++++++++++++ src/picamui.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 src/main.py create mode 100644 src/picam.py create mode 100644 src/picamui.py diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..78d5cc6 --- /dev/null +++ b/src/main.py @@ -0,0 +1,36 @@ +import picamui +import picam + +def main(): + captureResolution = (1280, 1024) + captureDirectory = "./images" + captureExtension = "jpg" + + # Setup UI + ui = picamui.PiCamUi() + ui.createUi() + + # Setup camera + cam = picam.PiCam() + cam.setPreviewResolution(ui.getScreenResolution()) + captureResolution = cam.getMaxResolution() + + loop = True + while loop: + rgb = cam.getPreviewFrame() + ui.updatePreview(rgb, cam.getPreviewResolution()) + ui.update() + + uiEvents = ui.getEvents() + for event in uiEvents: + if event == "keyDownEscape" or event == "pygameQuit" or event == "btnExitPressed": + loop = False + elif event == "btnTakePressed": + cam.capture(captureResolution, captureDirectory, captureExtension) + else: + print("Unknown event {}".format(event)) + ui.cleanup() + + +if __name__ == "__main__": + main() diff --git a/src/picam.py b/src/picam.py new file mode 100644 index 0000000..2581baf --- /dev/null +++ b/src/picam.py @@ -0,0 +1,44 @@ +import picamera +import io + +from datetime import datetime + +class PiCam: + camera = None + resPreview = (640, 480) + + def __init__(self): + self.camera = picamera.PiCamera() + + def setCamResolution(self, res): + self.camera.resolution = res + + def setPreviewResolution(self, res): + self.resPreview = res + self.setCamResolution(self.resPreview) + + def getPreviewResolution(self): + return self.resPreview + + def getMaxResolution(self): + return (self.camera.MAX_RESOLUTION.width, self.camera.MAX_RESOLUTION.height) + + def capture(self, res, directory, extension): + now = datetime.now() + strNow = now.strftime("%d-%m-%Y %H-%M-%S") + self.setCamResolution(res) + self.camera.capture("./{0}/{1}.{2}".format(directory, strNow, extension)) + self.setCamResolution(self.resPreview) + + def getPreviewFrame(self): + rgb = bytearray(self.getPreviewResolution()[0] * self.getPreviewResolution()[1] * 3) + stream = io.BytesIO() + self.camera.capture(stream, use_video_port=True, format="rgb") + stream.seek(0) + stream.readinto(rgb) + stream.close() + + return rgb + + def cleanup(self): + self.camera.close() diff --git a/src/picamui.py b/src/picamui.py new file mode 100644 index 0000000..08508b4 --- /dev/null +++ b/src/picamui.py @@ -0,0 +1,77 @@ +import pygame +import pygame_gui + +class PiCamUi: + screen = None + guiManager = None + clock = None + uiElements = [] + + def __init__(self): + pygame.init() + # Set the cursor to invisible. We use a transparent cursor for this as set_visible breaks the touch screen + pygame.mouse.set_cursor((8,8),(0,0),(0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0)) + self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # (0, 0) means same as display resolution + + def createUi(self): + self.guiManager = pygame_gui.UIManager((self.screen.get_width(), self.screen.get_height())) + self.clock = pygame.time.Clock() + + self.createUiElements() + + def createUiElements(self): + btnTake = { + "name": "btnTake", + "element": pygame_gui.elements.UIButton( + relative_rect = pygame.Rect((720, 200), (80, 80)), + text = "Take", + manager = self.guiManager + ) + } + self.uiElements.append(btnTake) + + btnExit = { + "name": "btnExit", + "element": pygame_gui.elements.UIButton( + relative_rect=pygame.Rect((760, 440), (40, 40)), + text='X', + manager=self.guiManager + ) + } + self.uiElements.append(btnExit) + + def updatePreview(self, rgb, res): + img = pygame.image.frombuffer(rgb[0:(res[0] * res[1] * 3)], res, 'RGB') + img = pygame.transform.scale(img, (self.screen.get_width(), self.screen.get_height())) + + if img: + self.screen.blit(img, (0, 0)) + + def update(self): + self.guiManager.draw_ui(self.screen) + pygame.display.update() + + def cleanup(self): + pygame.display.quit() + + def getEvents(self): + events = [] + time_delta = self.clock.tick(30)/1000.0 + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + events.append("keyDownEscape") + elif event.type == pygame.QUIT: + events.append("pygameQuit") + elif event.type == pygame.USEREVENT: + if event.user_type == pygame_gui.UI_BUTTON_PRESSED: + for element in self.uiElements: + if event.ui_element == element.get("element"): + events.append("{}Pressed".format(element.get("name"))) + self.guiManager.process_events(event) + self.guiManager.update(time_delta) + + return events + + def getScreenResolution(self): + return (self.screen.get_width(), self.screen.get_height())