Skip to content

Instantly share code, notes, and snippets.

@walchko
Created April 1, 2018 06:01
Show Gist options
  • Select an option

  • Save walchko/5c5245508e78dc342d23b086186e1457 to your computer and use it in GitHub Desktop.

Select an option

Save walchko/5c5245508e78dc342d23b086186e1457 to your computer and use it in GitHub Desktop.
bottle cv2 mjpeg server
#!/usr/bin/env python2
# https://gist.github.com/ph1ee/58d55a736462cc2f4f2d
from gevent import monkey; monkey.patch_all()
from bottle import route, run, template, request, response
import cv2
from bottle import debug
debug(True)
CRLF = "\r\n"
class MJPEG(object):
def __init__(self):
self.cap = cv2.VideoCapture(0)
def __del__(self):
self.cap.release()
def __iter__(self):
return self
def next(self):
try:
ret, img = self.cap.read()
if ret:
ret, jpg = cv2.imencode('.jpg', img)
if ret:
out = "--jpgboundary"
out += "Content-type: image/jpeg" + CRLF
out += "Content-length: " + str(jpg.size) + CRLF + CRLF
print('loop')
return out + jpg.tostring()
return "error"
except:
exit()
def stop(self):
pass
@route('/ip')
def show_ip():
ip = request.environ.get('REMOTE_ADDR')
# or ip = request.get('REMOTE_ADDR')
# or ip = request['REMOTE_ADDR']
return template("Your IP is: {{ip}}", ip=ip)
@route('/hello/<name>')
def index(name):
return template('<b>Hello {{name}}</b>!', name=name)
@route('/image')
def capture():
response.headers['Content-Type'] = 'multipart/x-mixed-replace; boundary=--jpgboundary'
return iter(MJPEG())
@route('/bye')
def ret():
d = {'a': 5}
return d # automagically converts to json
run(host='localhost', port=8080, server='gevent')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment