# import the necessary packages from imutils.video import FPS from picamera.array import PiRGBArray from picamera import PiCamera from threading import Thread import cv2 class PiVideoStream: def __init__(self, resolution=(320, 240), framerate=32): # initialize the camera and stream self.camera = PiCamera() self.camera.resolution = resolution self.camera.framerate = framerate self.rawCapture = PiRGBArray(self.camera, size=resolution) self.stream = self.camera.capture_continuous(self.rawCapture, format="bgr", use_video_port=True) # initialize the frame and the variable used to indicate # if the thread should be stopped self.frame = None self.stopped = False self.fps = None self.thread = None self.startup = True def start(self): # start the thread to read frames from the video stream self.thread = Thread(target=self.update, args=()) self.thread.start() return self def update(self): # keep looping infinitely until the thread is stopped for f in self.stream: if self.startup: self.fps = FPS().start() self.startup = False # grab the frame from the stream and clear the stream in # preparation for the next frame self.frame = f.array self.rawCapture.truncate(0) self.fps.update() # if the thread indicator variable is set, stop the thread # and resource camera resources if self.stopped: self.fps.stop() self.stream.close() self.rawCapture.close() self.camera.close() return def read(self): # return the frame most recently read return self.frame def stop(self): # indicate that the thread should be stopped self.stopped = True if self.thread != None: self.thread.join() def getfps(self): return self.fps