import time import cv2 import imutils from threading import Thread from picamera import PiCamera from piCameraPipeline.PiCameraPipeline import RgbProcessorAdapter class VideoSource(RgbProcessorAdapter): def __init__(self, fileName, res, framerate): super(VideoSource, self).__init__(res) self.fileName = fileName self.res = res self.framerate = framerate self.thread = None self.camera = None self.cancel = False if fileName == 'piCamera': self.camera = PiCamera() self.camera.resolution = (self.res[0], self.res[1]) self.camera.framerate = self.framerate else: self.needRgbConversion = False self.thread = Thread(target=self.fileReadThread) def fileReadThread(self): pass def start(self): if self.thread is not None: if not self.thread.is_alive(): self.thread.start() else: self.camera.start_recording(self, format="bgr") def stop(self): if self.thread is not None: if self.thread.is_alive(): self.cancel = True self.thread.join() else: self.camera.stop_recording() def fileReadThread(self): cap = cv2.VideoCapture(self.fileName) cap_w = cap.get(cv2.CAP_PROP_FRAME_WIDTH) cap_h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) needResize = False if self.res[0] != cap_w or self.res[1] != cap_h: needResize = True while not self.cancel: ret, frame = cap.read() if ret: if needResize: self.write(imutils.resize(frame, width=self.res[0], height=self.res[1])) else: self.write(frame) else: break time.sleep(1.0/self.framerate) self.flush()