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, resolution, framerate): super(VideoSource, self).__init__(resolution) self.fileName = fileName self.resolution = resolution self.framerate = framerate self.thread = None self.camera = None self.cancel = False if fileName == 'piCamera': self.camera = PiCamera() self.camera.resolution = (self.resolution[0], self.resolution[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.resolution[0] != cap_w or self.resolution[1] != cap_h: needResize = True while not self.cancel: ret, frame = cap.read() if ret: if needResize: self.write(imutils.resize(frame, width=self.resolution[0], height=self.resolution[1])) else: self.write(frame) else: break time.sleep(1.0/self.framerate) self.flush()