X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/5c59d0214abee9c50a57ea258c83bf7c05e93a87..a0ffea12425b22e87010c097a393e9b627eb0a29:/capture.py diff --git a/capture.py b/capture.py index 98ad7be..7f3234b 100755 --- a/capture.py +++ b/capture.py @@ -1,9 +1,13 @@ #!/usr/bin/env python -"""Go image capture.""" +"""Go image capture""" +import os import sys import argparse +import time +from threading import Thread +from Queue import Queue, Empty import pygame from pygame.locals import QUIT, KEYDOWN @@ -12,9 +16,9 @@ import Image from camera import Camera class Screen: - def __init__(self): + def __init__(self, res): pygame.init() - pygame.display.set_mode((640,480)) + pygame.display.set_mode(res) pygame.display.set_caption("Go image capture") self._screen = pygame.display.get_surface() @@ -23,37 +27,128 @@ class Screen: self._screen.blit(pg_img, (0,0)) pygame.display.flip() +class Capture: + def __init__(self, device, res): + self.cam = Camera(vid=device, res=res) + self.screen = Screen(res) + + self.im_number = 0 + + self.saving_dir = "./captured/" + time.strftime("%Y-%m-%d %H:%M/") + + if not os.path.isdir(self.saving_dir): + os.makedirs(self.saving_dir) + + def __del__(self): + del self.cam + + def live(self, q): + done = False + clock = pygame.time.Clock() + while not done: #live preview + if q: + try: + line = q.get_nowait() # or q.get(timeout=.1) + except Empty: + pass + else: + if line == "stop\n": + done = True + elif line == "exit\n": + sys.exit() + else: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + sys.exit() + elif event.type == pygame.KEYDOWN: + done = True + + im = self.cam.get_image() + self.screen.display_picture(im) + clock.tick(5) + + def auto(self, interval): + last = 0 + clock = pygame.time.Clock() + done = False + + while not done: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + done = True + if time.time() - last > interval: + last = time.time() + self.take() + clock.tick(15) + + def manual(self): + while True: + event = pygame.event.wait() + if event.type == QUIT: + break + if event.type != KEYDOWN: + continue + self.take() + + + def take(self): + im = self.cam.get_image() + self.screen.display_picture(im) + im.save(self.saving_dir + "{0:0>3}.jpg".format(self.im_number), 'JPEG') + self.im_number += 1 + def main(): parser = argparse.ArgumentParser(description=__doc__) - #parser.add_argument('file', metavar='file', nargs=1, - # help="image to analyse") - #parser.add_argument('-w', type=int, default=640, - # help="scale image to the specified width before analysis") - parser.add_argument('-d', '--device', type=int, default=0, - help="number of video device to use") - #parser.add_argument('-s', '--save', dest='do_something', action='store_const', - # const=image_save, default=im_debug.show, - # help="save images instead of displaying them") + parser.add_argument('-c', '--cmd', dest='cmd', action='store_true', + help="take commands from stdin") + parser.add_argument('-d', type=int, default=0, + help="video device id") + parser.add_argument('-a', type=int, default=0, + help="take picture automaticaly every A seconds") + parser.add_argument('-r', type=int, nargs=2, default=[640, 480], + help="set camera resolution") args = parser.parse_args() - cam = Camera(device=args.device) - screen = Screen() + res=(args.r[0], args.r[1]) + capture = Capture(args.d, res) + + + if args.cmd: + + def enqueue_input(queue): + for line in iter(sys.stdin.readline, b''): + queue.put(line) + + q = Queue() + t = Thread(target=enqueue_input, args=(q,)) + t.daemon = True + t.start() + + capture.live(q) + + clock = pygame.time.Clock() + while True: - im = cam.get_image() - screen.display_picture(im) + try: + line = q.get_nowait() # or q.get(timeout=.1) + except Empty: + pass + else: + if line == "take\n": + capture.take() + elif line == "exit\n": + break + clock.tick(10) - im_number = 0 + else: + capture.live(None) + if args.a > 0: + capture.auto(args.a) + else: + capture.manual() - while True: - event = pygame.event.wait() - if event.type == QUIT: - break - elif event.type == KEYDOWN: - im = cam.get_image() - screen.display_picture(im) - im.save("./captured/{0:0>3}.jpg".format(im_number), 'JPEG') - im_number += 1 + del capture if __name__ == '__main__': try: