PiCamの高速化
2017年7月20日 - 未分類
RaspberryPiのpicameraは、小さくて優秀ですが、読み込み速度があまり早くないなって思っていました。ふと、Therad化すれば、早くなるんじゃないかって考えて調べるとありました。
Therad化することで、カメラ画像の読込が3,4倍早くなります。使い方も簡単です。ほぼ、ストレスなく動くように見えます。
# import the necessary packages from picamera.array import PiRGBArray from picamera import PiCamera from threading import Thread import cv2 import time 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) self.stopped=False # initialize the frame and the variable used to indicate # if the thread should be stopped self.frame = None self.stopped = False #self.camera.resolution = (640, 480) #self.camera.framerate = 32 self.camera.sharpness = 0 self.camera.contrast = 0 self.camera.brightness = 50 self.camera.saturation = 0 self.camera.ISO = 0 self.camera.video_stabilization = False self.camera.exposure_compensation = 0 #self.camera.exposure_mode = 'off' self.camera.awb_mode = 'flash' self.camera.meter_mode = 'average' self.camera.image_effect = 'none' self.camera.color_effects = None self.camera.rotation = 0 self.camera.hflip = True self.camera.vflip = True self.camera.crop = (0.0, 0.0, 1.0, 1.0) def start(self): # start the thread to read frames from the video stream Thread(target=self.update, args=()).start() return self def update(self): # keep looping infinitely until the thread is stopped for f in self.stream: # grab the frame from the stream and clear the stream in # preparation for the next frame self.frame = f.array self.rawCapture.truncate(0) # if the thread indicator variable is set, stop the thread # and resource camera resources if self.stopped: 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 def seek(self): self.rawCapture.seek(-1,2) vs = PiVideoStream((640,480),32).start() time.sleep(2.0) def PiCamCapture(): return vs.read() def PiCamCaptureSeek(): return vs.seek() def PiCamCaptureStop(): vs.stop() if __name__ == '__main__': # cv2.namedWindow('Frame', cv2.WINDOW_NORMAL) while True: frame = PiCamCapture() # check to see if the frame should be displayed to our screen cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF if key == 27: break # do a bit of cleanup cv2.destroyAllWindows() PiCamCaptureStop()