963f6edac1a025a50ba667ba3350f1c08d9e688b
[imago.git] / capture.py
1 #!/usr/bin/env python
2
3 """Go image capture"""
4
5 import os
6 import sys
7 import argparse
8 import time
9
10 import pygame
11 from pygame.locals import QUIT, KEYDOWN
12 import Image
13
14 from camera import Camera
15
16 class Screen:
17     def __init__(self, res):
18         pygame.init()
19         pygame.display.set_mode(res)
20         pygame.display.set_caption("Go image capture")
21         self._screen = pygame.display.get_surface()
22
23     def display_picture(self, im):
24         pg_img = pygame.image.frombuffer(im.tostring(), im.size, im.mode)
25         self._screen.blit(pg_img, (0,0))
26         pygame.display.flip()
27
28 class Capture:
29     def __init__(self, device, res):
30         self.cam = Camera(vid=device, res=res)
31         self.screen = Screen(res)
32
33         self.im_number = 0
34
35         self.saving_dir = "./captured/" + time.strftime("%Y-%m-%d %H:%M/")
36
37         if not os.path.isdir(self.saving_dir):
38             os.makedirs(self.saving_dir)
39
40     def __del__(self):
41         del self.cam
42
43     def live(self):
44         done = False
45         clock = pygame.time.Clock()
46         while not done: #live preview
47             for event in pygame.event.get():
48                 if event.type == pygame.QUIT:
49                     done = True
50                     sys.exit()
51                 if event.type == pygame.KEYDOWN:
52                     done = True
53
54             im = self.cam.get_image()
55             self.screen.display_picture(im)
56             clock.tick(5)
57
58     def auto(self, interval):
59         last = 0
60         clock = pygame.time.Clock()
61         done = False
62
63         while not done:
64             for event in pygame.event.get():
65                 if event.type == pygame.QUIT:
66                     done = True
67             if time.time() - last > interval:
68                 last = time.time()
69                 im = self.cam.get_image()
70                 self.screen.display_picture(im)
71                 im.save(self.saving_dir + "{0:0>3}.jpg".format(self.im_number), 'JPEG')
72                 self.im_number += 1
73             clock.tick(15)
74
75     def manual(self):
76         while True:
77             event = pygame.event.wait()
78             if event.type == QUIT:
79                 break
80             if event.type != KEYDOWN:
81                 continue
82
83             im = cam.get_image()
84             self.screen.display_picture(im)
85             im.save(self.saving_dir + "{0:0>3}.jpg".format(self.im_number), 'JPEG')
86             self.im_number += 1
87
88
89
90 def main():
91     parser = argparse.ArgumentParser(description=__doc__)
92     parser.add_argument('-d', type=int, default=0,
93                         help="video device id")
94     parser.add_argument('-a', type=int, default=0,
95                         help="take picture automaticaly every A seconds")
96     parser.add_argument('-r', type=int, nargs=2, default=[640, 480],
97                         help="set camera resolution")
98     args = parser.parse_args()
99
100     res=(args.r[0], args.r[1])
101     capture = Capture(args.d, res)
102
103     capture.live()
104
105     if args.a > 0:
106         capture.auto(args.a)
107     else:
108         capture.manual()
109     del capture
110     
111 if __name__ == '__main__':
112     try:
113         main()
114     finally:
115         pygame.quit()