color distribution plot
[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 from threading import Thread
10 from Queue import Queue, Empty
11
12 import pygame
13 from pygame.locals import QUIT, KEYDOWN
14 import Image
15
16 from camera import Camera
17
18 class Screen:
19     def __init__(self, res):
20         pygame.init()
21         pygame.display.set_mode(res)
22         pygame.display.set_caption("Go image capture")
23         self._screen = pygame.display.get_surface()
24
25     def display_picture(self, im):
26         pg_img = pygame.image.frombuffer(im.tostring(), im.size, im.mode)
27         self._screen.blit(pg_img, (0,0))
28         pygame.display.flip()
29
30 class Capture:
31     def __init__(self, device, res):
32         self.cam = Camera(vid=device, res=res)
33         self.screen = Screen(res)
34
35         self.im_number = 0
36
37         self.saving_dir = "./captured/" + time.strftime("%Y-%m-%d %H:%M/")
38
39         if not os.path.isdir(self.saving_dir):
40             os.makedirs(self.saving_dir)
41
42     def __del__(self):
43         del self.cam
44
45     def live(self, q):
46         done = False
47         clock = pygame.time.Clock()
48         while not done: #live preview
49             if q:
50                 try:
51                     line = q.get_nowait() # or q.get(timeout=.1)
52                 except Empty:
53                     pass
54                 else:
55                     if line == "stop\n":
56                         done = True
57                     elif line == "exit\n":
58                         sys.exit()
59             else:
60                 for event in pygame.event.get():
61                     if event.type == pygame.QUIT:
62                         sys.exit()
63                     elif event.type == pygame.KEYDOWN:
64                         done = True
65
66             im = self.cam.get_image()
67             self.screen.display_picture(im)
68             clock.tick(5)
69
70     def auto(self, interval):
71         last = 0
72         clock = pygame.time.Clock()
73         done = False
74
75         while not done:
76             for event in pygame.event.get():
77                 if event.type == pygame.QUIT:
78                     done = True
79             if time.time() - last > interval:
80                 last = time.time()
81                 self.take()
82             clock.tick(15)
83
84     def manual(self):
85         while True:
86             event = pygame.event.wait()
87             if event.type == QUIT:
88                 break
89             if event.type != KEYDOWN:
90                 continue
91             self.take()
92             
93
94     def take(self):
95         im = self.cam.get_image()
96         self.screen.display_picture(im)
97         im.save(self.saving_dir + "{0:0>3}.jpg".format(self.im_number), 'JPEG')
98         self.im_number += 1
99
100
101 def main():
102     parser = argparse.ArgumentParser(description=__doc__)
103     parser.add_argument('-c', '--cmd', dest='cmd', action='store_true',
104                     help="take commands from stdin")
105     parser.add_argument('-d', type=int, default=0,
106                         help="video device id")
107     parser.add_argument('-a', type=int, default=0,
108                         help="take picture automaticaly every A seconds")
109     parser.add_argument('-r', type=int, nargs=2, default=[640, 480],
110                         help="set camera resolution")
111     args = parser.parse_args()
112
113     res=(args.r[0], args.r[1])
114     capture = Capture(args.d, res)
115
116
117     if args.cmd:
118
119         def enqueue_input(queue):
120             for line in iter(sys.stdin.readline, b''):
121                 queue.put(line)
122
123         q = Queue()
124         t = Thread(target=enqueue_input, args=(q,))
125         t.daemon = True 
126         t.start()
127         
128         capture.live(q)
129
130         clock = pygame.time.Clock()
131         while True:
132
133             try:
134                 line = q.get_nowait() # or q.get(timeout=.1)
135             except Empty:
136                 pass
137             else: 
138                 if line == "take\n":
139                     capture.take()
140                 elif line == "exit\n":
141                     break
142             clock.tick(10)
143
144     else:
145         capture.live(None)
146         if args.a > 0:
147             capture.auto(args.a)
148         else:
149             capture.manual()
150
151     del capture
152     
153 if __name__ == '__main__':
154     try:
155         main()
156     finally:
157         pygame.quit()