Mercurial > code > home > repos > light9
annotate bin/picamserve @ 1087:1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Ignore-this: 38fc34a6eff577c05129df87d6133a95
author | Drew Perttula <drewp@bigasterisk.com> |
---|---|
date | Wed, 04 Jun 2014 08:30:45 +0000 |
parents | |
children | bb92c50438ed |
rev | line source |
---|---|
1087
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 #!env_pi/bin/python |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 from __future__ import division |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 from run_local import log |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 import sys;sys.path.append('/usr/lib/python2.7/dist-packages/') |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
5 import io, logging, traceback |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
6 import cyclone.web |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
7 from twisted.internet import reactor |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
8 from light9 import prof |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
9 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
10 try: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
11 import picamera |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 cameraCls = picamera.PiCamera |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 except ImportError: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 class cameraCls(object): |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 def __enter__(self): return self |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
16 def __exit__(self): pass |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
17 def capture(self, out, *a, **kw): |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
18 out.write(open('yuv.demo').read()) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 @prof.logTime |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
21 def getFrame(c, arg): |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
22 res = int(arg('res', 480)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
23 c.resolution = { |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
24 480: (640, 480), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
25 1080: (1920, 1080), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
26 1944: (2592, 1944), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
27 }[res] |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
28 c.shutter_speed = int(arg('shutter', 50000)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
29 c.exposure_mode = arg('exposure_mode', 'fixedfps') |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
30 c.awb_mode = arg('awb_mode', 'off') |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
31 c.brightness = int(arg('brightness', 50)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
32 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
33 c.awb_gains = (float(arg('redgain', 1)), float(arg('bluegain', 1))) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
34 c.crop = (float(arg('x', 0)), float(arg('y', 0)), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
35 float(arg('w', 1)), float(arg('h', 1))) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
36 rw = rh = int(arg('resize', 100)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
37 # width 1920, showing w=.3 of image, resize=100 -> scale is 100/.3*1920 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
38 # scl is [ output px / camera px ] |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
39 scl1 = rw / (c.crop[2] * c.resolution[0]) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
40 scl2 = rh / (c.crop[3] * c.resolution[1]) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
41 if scl1 < scl2: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
42 # width is the constraint; reduce height to the same scale |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
43 rh = int(scl1 * c.crop[3] * c.resolution[1]) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
44 else: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
45 # height is the constraint |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
46 rw = int(scl2 * c.crop[2] * c.resolution[0]) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
47 c.ISO = int(arg('iso', 250)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
48 out = io.BytesIO('w') |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
49 prof.logTime(c.capture)(out, 'jpeg', use_video_port=True, resize=(rw, rh)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
50 return out.getvalue() |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
51 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
52 class Pic(cyclone.web.RequestHandler): |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
53 def get(self): |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
54 try: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
55 self.set_header('Content-Type', 'image/jpeg') |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
56 self.write(getFrame(self.settings.camera, self.get_argument)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
57 except Exception: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
58 traceback.print_exc() |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
59 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
60 log.setLevel(logging.INFO) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
61 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
62 with cameraCls() as camera: |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
63 port = 8001 |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
64 reactor.listenTCP(port, cyclone.web.Application(handlers=[ |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
65 (r'/pic', Pic), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
66 (r'/static/(.*)', cyclone.web.StaticFileHandler, {'path': 'static/'}), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 (r'/(|gui.js)', cyclone.web.StaticFileHandler, {'path': 'light9/vidref/', |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 'default_filename': 'index.html'}), |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 ], debug=True, camera=camera)) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
70 log.info("serving on %s" % port) |
1f877950ad28
new picamserve for raspberry pi camera -> http, especially with crop control
Drew Perttula <drewp@bigasterisk.com>
parents:
diff
changeset
|
71 reactor.run() |