Exemple #1
0
    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
Exemple #2
0
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()
Exemple #3
0
    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)
Exemple #4
0
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