Skip to main content

PI 카메라 프로그램 (Thread)

PI 카메라 프로그램 (Thread)

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2
import threading
import time
import logging
import os

logger = logging.getLogger(__name__)
archive_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'archive')

thread = None
status = False

# Set up camera constants
#IM_WIDTH = 1024
#IM_HEIGHT = 768
IM_WIDTH = 640
IM_HEIGHT = 480

class PiWebCamera:
    def __init__(self,fps=20):
        logger.info(f"Initializing pi camera class with {fps} fps ")
        self.fps = fps
        self.camera = PiCamera(framerate=24)
        self.camera.resolution = (IM_WIDTH,IM_HEIGHT)
        # self.camera.rotation = 180 
        self.rawCapture = PiRGBArray(self.camera, size=(IM_WIDTH,IM_HEIGHT))
        self.rawCapture.truncate(0)
        self.max_frames = 5*self.fps
        self.frames = []
        self.isrunning = False
        
    def run(self):
        logging.debug("Perparing Pi Camera thread")
        global thread
        if thread is None:
            logging.debug("Creating PI thread")
            thread = threading.Thread(target=self._capture_loop,daemon=True)
            logger.debug("Starting PI thread")
            self.isrunning = True
            thread.start()
            logger.info("Thread PI started")

    def _capture_loop(self):
        global status
        dt = 1/self.fps
        logger.debug("Observation started")
        while self.isrunning:
            if(status):
                self.camera.capture(self.rawCapture, format="bgr", use_video_port=True)
                self.rawCapture.truncate(0)
                image = self.rawCapture.array
                if len(self.frames)==self.max_frames:
                    self.frames = self.frames[1:]
                self.frames.append(image)
            time.sleep(dt)
        logger.info("Thread stopped successfully")

    def status(self):
        global status
        logger.debug("Status isrunning" + str(status))
        if(status):
            content = "STOP THREAD !"
            status = False
        else:
            content = "START THREAD !"
            status = True
        return content

        
    def get_frame(self, _bytes=True):
        if len(self.frames)>0:
            if _bytes:
                img = cv2.imencode('.png',self.frames[-1])[1].tobytes()
            else:
                img = self.frames[-1]
        else:
            with open(archive_path+"/not_found.jpeg","rb") as f:
                img = f.read()
        return img