def __init__(self, system="auto", vidsize=0.2, framerate=32, crop=False, rotation=0, maxres=None): """Opens a video stream from native camera, webcam or rpi camera""" if system == "auto": self.cam = "rpi" if isrpi() else 0 elif system in ["rpi", 0, 1, 2]: self.cam = system else: self.cam = 0 self.crop = crop if self.cam == "rpi": from picamera.array import PiRGBArray from picamera import PiCamera if isinstance(maxres, tuple): self.maxres = maxres elif maxres == "v2": self.maxres = (3264, 2464) elif maxres == "hq": self.maxres = (4056, 3040) else: self.maxres = (2592, 1952) self.res = (self.maxres[0] * vidsize, self.maxres[1] * vidsize) self.res = picamconv(self.res) self.camera = PiCamera() self.camera.resolution = self.res self.camera.framerate = framerate self.camera.rotation = rotation self.rawCapture = PiRGBArray(self.camera, size=self.res) self.stream = self.camera.capture_continuous(self.rawCapture, format="bgr", use_video_port=True) else: self.stream = cv2.VideoCapture(self.cam) self.stream.set(3, 4000) self.stream.set(4, 4000) self.maxres = (int(self.stream.get(3)), int(self.stream.get(4))) self.stream.set(3, int(self.maxres[0] * vidsize)) self.stream.set(4, int(self.maxres[1] * vidsize)) self.res = (int(self.stream.get(3)), int(self.stream.get(4))) self.stopped = False
def rec(): """To run pirecorder from the command line""" parser = argparse.ArgumentParser( prog="record", description="Runs PiRecorder record function") parser.add_argument("-c", "--configfile", default="pirecorder.conf", action="store", help="pirecorder configuration file") args = parser.parse_args() if not isrpi(): lineprint("PiRecorder only works on a raspberry pi. Exiting..") return rec = PiRecorder(args.configfile) rec.settings(internal=True) rec.record()
def __init__(self, configfile="pirecorder.conf", logging=True): if not isrpi(): lineprint("PiRecorder only works on a raspberry pi. Exiting..") return self.system = "auto" self.host = gethostname() self.home = homedir() self.setupdir = self.home + "pirecorder" self.logfolder = self.setupdir + "/logs/" if not os.path.exists(self.logfolder): os.makedirs(self.setupdir) os.makedirs(self.logfolder) lineprint("Setup folder created (" + self.setupdir + ")..") if not os.path.exists(self.logfolder): lineprint("Setup folder exists but was not set up properly..") if logging: self.log = Logger(self.logfolder + "/pirecorder.log") self.log.start() print("") lineprint("pirecorder " + __version__ + " started!", date=True) lineprint("=" * 47, False) self.brightfile = self.setupdir + "/cusbright.yml" self.configfilerel = configfile self.configfile = self.setupdir + "/" + configfile self.config = LocalConfig(self.configfile, compact_form=True) if not os.path.isfile(self.configfile): lineprint("Config file " + configfile + " not found, new file created..") for section in ["rec", "cam", "cus", "img", "vid"]: if section not in list(self.config): self.config.add_section(section) self.settings(recdir="pirecorder/recordings", subdirs=False, label="test", rectype="img", rotation=0, brighttune=0, roi=None, gains=(1.0, 2.5), brightness=45, contrast=10, saturation=0, iso=200, sharpness=0, compensation=0, shutterspeed=8000, imgdims=(2592, 1944), maxres=None, viddims=(1640, 1232), imgfps=1, vidfps=24, imgwait=5.0, imgnr=12, imgtime=60, imgquality=50, vidduration=10, viddelay=10, vidquality=11, automode=True, internal="", maxviddur=3600, maxvidsize=0) lineprint("Config settings stored..") else: lineprint("Config file " + configfile + " loaded..") lineprint("Recording " + self.config.rec.rectype + " in " +\ self.home + self.config.rec.recdir) self._imgparams() self._shuttertofps() if self.config.rec.rectype == "imgseq": if self.config.cam.shutterspeed / 1000000. >= ( self.config.img.imgwait / 5): lineprint("imgwait is not enough for provided shutterspeed" + \ ", will be overwritten..") if self.config.rec.recdir == "NAS": if not os.path.ismount(self.config.rec.recdir): self.recdir = self.home lineprint("Recdir not mounted, storing in home directory..") self.recdir = self.home + self.config.rec.recdir if not os.path.exists(self.recdir): os.makedirs(self.recdir) os.chdir(self.recdir)
def Camconfig(cam=None, auto=None, iso=200, framerate=20, res=(1640, 1232), vidsize=0.4): """ Opens a video stream to configure a wide array of camera parameters Note: A screen resolution of at least 800x600 is strongly recommended """ if not isrpi(): lineprint("PiRecorder only works on a raspberry pi. Exiting..") return import picamera import picamera.array def nothing(x): pass if cam == None: cam = picamera.PiCamera() cam.resolution = res cam.iso = iso cam.framerate = framerate time.sleep(2) if cam == None or (auto == None or auto == True): cam.exposure_mode = "auto" set_auto = 1 else: set_auto = 0 res = (cam.resolution[0] * vidsize, cam.resolution[1] * vidsize) res = (int(res[0] * cam.zoom[2]), int(res[1] * cam.zoom[3])) if (res[0] * res[1]) >= (1640 * 1232): res = maxrect(dims, maxdims=(1640, 1232), decimals=0) cam.resolution = picamconv(res) cv2.namedWindow("Stream", cv2.WND_PROP_FULLSCREEN) cv2.namedWindow("Config", cv2.WINDOW_NORMAL) cv2.setWindowProperty("Stream", cv2.WND_PROP_AUTOSIZE, cv2.WINDOW_NORMAL) cv2.resizeWindow("Stream", cam.resolution[0], cam.resolution[1]) config = [] isos = [100, 200, 320, 400, 500, 640, 800] set_rot = cam.rotation * 180 set_fps = int(cam.framerate) set_iso = [i for i, j in enumerate(isos) if j == cam.iso][0] set_comp = cam.exposure_compensation + 25 set_shut = cam.shutter_speed set_red = int(float(cam.awb_gains[0]) * 10) set_blue = int(float(cam.awb_gains[1]) * 10) set_bri = cam.brightness set_con = cam.contrast + 100 set_sat = cam.saturation + 100 set_shar = cam.sharpness + 100 cv2.createTrackbar("rotation (0deg/180deg)", "Config", set_rot, 1, nothing) cv2.createTrackbar("framerate", "Config", set_fps, 40, nothing) cv2.createTrackbar("automatic (off/on)", "Config", set_auto, 1, nothing) cv2.createTrackbar("iso", "Config", set_iso, 6, nothing) cv2.createTrackbar("compensation", "Config", set_comp, 50, nothing) cv2.createTrackbar("shutterspeed (ms)", "Config", set_shut, 99999, nothing) cv2.createTrackbar("red gain", "Config", set_red, 80, nothing) cv2.createTrackbar("blue gain", "Config", set_blue, 80, nothing) cv2.createTrackbar("brightness", "Config", set_bri, 100, nothing) cv2.createTrackbar("contrast", "Config", set_con, 200, nothing) cv2.createTrackbar("saturation", "Config", set_sat, 200, nothing) cv2.createTrackbar("sharpness", "Config", set_shar, 200, nothing) rawCapture = picamera.array.PiRGBArray(cam, size=cam.resolution) lineprint("Streaming interactive video..") with rawCapture as stream: while True: cam.capture(stream, format="bgr", use_video_port=True) image = stream.array rot = cv2.getTrackbarPos("rotation (0deg/180deg)", "Config") fps = cv2.getTrackbarPos("framerate", "Config") auto = cv2.getTrackbarPos("automatic (off/on)", "Config") iso = cv2.getTrackbarPos("iso", "Config") comp = cv2.getTrackbarPos("compensation", "Config") shut = cv2.getTrackbarPos("shutterspeed (ms)", "Config") red = cv2.getTrackbarPos("red gain", "Config") blue = cv2.getTrackbarPos("blue gain", "Config") bri = cv2.getTrackbarPos("brightness", "Config") con = cv2.getTrackbarPos("contrast", "Config") sat = cv2.getTrackbarPos("saturation", "Config") shar = cv2.getTrackbarPos("sharpness", "Config") cam.rotation = [0, 180][rot] cam.framerate = max(fps, 1) cam.exposure_mode = ["off", "auto"][auto] cam.iso = isos[iso] cam.exposure_compensation = comp - 25 cam.awb_mode = cam.exposure_mode if cam.exposure_mode == "off": cam.shutter_speed = shut maxshut = int(float(1 / cam.framerate) * 1000000) if shut > maxshut: cv2.setTrackbarPos("shutterspeed (ms)", "Config", maxshut) cam.awb_gains = (red / 10, blue / 10) if cam.exposure_mode == "auto": cam.shutter_speed = 0 shut = cam.exposure_speed red, blue = [int(float(i) * 10) for i in cam.awb_gains] cv2.setTrackbarPos("shutterspeed (ms)", "Config", shut) cv2.setTrackbarPos("red gain", "Config", red) cv2.setTrackbarPos("blue gain", "Config", blue) cam.brightness = bri cam.contrast = con - 100 cam.saturation = sat - 100 cam.sharpness = shar - 100 cv2.imshow("Stream", image) stream.truncate(0) k = cv2.waitKey(10) & 0xFF if k == ord("s"): if cam.shutter_speed == 0: shutterspeed = cam.exposure_speed else: shutterspeed = cam.shutter_speed gains = tuple([round(float(i), 2) for i in cam.awb_gains]) config = { "automode": [False, True][auto], "vidfps": cam.framerate, "rotation": cam.rotation, "gains": gains, "brightness": cam.brightness, "contrast": cam.contrast, "saturation": cam.saturation, "iso": cam.iso, "sharpness": cam.sharpness, "compensation": cam.exposure_compensation, "shutterspeed": shutterspeed } break if k == 27: lineprint("User exited..") break rawCapture.close() cam.close() cv2.destroyAllWindows() cv2.waitKey(1) return config