基于tornado实现web camera


近期在学习python。找了一个框架学习,我选择的是tornado。由于其不仅仅是一个web开发框架,其还是一个server,异步事件库,一举多得。

我一直在完opencv,我想接合他们两个做一个web camera,这就開始。

在tornado中要实现对一个URL的响应,须要实现你自己的Handle。依据你对外提供的接口。实现相关的接口就好了。

以下为整个project的文件内容:

import tornado.ioloop
import tornado.web
import tornado.gen
import cv2 from tornado.options import define, options define("port", default = 5000, help = "run in tornado on xxxx port", type = int)
define("id", default = 0, help = "camera id", type = int) def auth(func):
def _auth(self):
if not self.current_user:
re = {"code" : 404, "message" : "login failed!"}
self.write(re)
else:
func(self)
return _auth; class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie("user") class LoginHandler(BaseHandler):
def get(self):
self.write('<html><body><form action="/login" method="post">'
'Name: <input type="text" name="name">'
'<input type="submit" value="Sign in">'
'</form></body></html>') def post(self):
name = self.get_argument("name", "error")
if name == "error":
re = {"code" : 404, "message" : "login failed!"}
else:
self.set_secure_cookie("user", name)
re = {"code" : 200, "message" : "login successfully!"}
self.write(re) class CameraHandler(BaseHandler):
@auth
def get(self):
ret, image = self.application.cap.read()
if ret:
self.set_header("Content-Type", "image/jpeg")
self.set_header("Refresh", "1")
self.set_header("content-transfer-encoding", "binary")
r, i = cv2.imencode('.jpg', image)
if r:
self.write(bytes(i.data))
else:
selt.write('Sorry, encode faily!')
else:
self.write('Sorry, get camera data faily!') class Application(tornado.web.Application):
def __init__(self, camera_id):
handlers = [('/camera', CameraHandler), ('/login', LoginHandler)]
self.cap = cv2.VideoCapture(camera_id)
self.camera_id = camera_id;
tornado.web.Application.__init__(self, handlers, debug = True ,cookie_secret = "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o") def __del__(self):
self.cap.release() if __name__ == '__main__':
tornado.options.parse_command_line();
app = Application(options.id)
app.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

这当中还包含了一个login的样例。我学习tornado是为了使用其做app后台,所以我实现了自己的auth的修饰器,这样仅仅是返回一串json字符。而不是重定向到login页面。

在Application构造时设置设备,在http://localhost:xxx/camera这个url上使用get方法就会返回一副图片。

    def get(self):
ret, image = self.application.cap.read()
if ret:
self.set_header("Content-Type", "image/jpeg")
self.set_header("Refresh", "1")
self.set_header("content-transfer-encoding", "binary")
r, i = cv2.imencode('.jpg', image)
if r:
self.write(bytes(i.data))
else:
selt.write('Sorry, encode faily!')
else:
self.write('Sorry, get camera data faily!')

这段代码就是这个功能,開始的时候我仅仅是将数据拿出来就发送,没有进行imencode。导致浏览器不能正确的显示。使用Refresh实现自己主动的刷新。

项目地址:https://git.oschina.net/zhouX/web_camera.git

无图无真相:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh4NjA0NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="此处输入图片的描写叙述" title="">

基于tornado实现web camera的更多相关文章

  1. 基于tornado的文件上传demo

    这里,web框架是tornado的4.0版本,文件上传组件,是用的bootstrap-fileinput. 这个小demo,是给合作伙伴提供的,模拟APP上摄像头拍照,上传给后台服务进行图像识别用,识 ...

  2. 生产环境优雅的重启基于Nginx、Tornado的Web服务进程

    Nginx是一个高效的Web服务器及代理服务器,Tornado是一个基于epoll的异步Web开发框架,通常使用Nginx做为Web服务器时,都会以FastCGI模式,而我们从开发.调试.运维的角度考 ...

  3. 在Autodesk应用程序商店发布基于浏览器的Web应用程序

    你一定已经听说过Autodesk应用程序商店了,通过Autodesk应用程序商店,你可以免费下载或购买来自全球的优秀开发者发布的应用程序,来帮助你更快更方便的完成你的工作.而且作为开发者,您也可以在A ...

  4. 基于服务(Web Service)的文件管理Winform客户端实现(二)

    上一篇主要介绍文件管理服务有哪些方法,实现了哪些功能. 基于服务(Web Service)的文件管理Winform客户端实现(一) 本篇将根据文件服务服务实现Winform客户端设计.开发. 3.   ...

  5. 基于HTML5的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  6. 基于HT for Web矢量实现3D叶轮旋转

    在上一篇<基于HT for Web矢量实现2D叶轮旋转>中讲述了叶轮旋转在2D上的应用,今天我们就来讲讲叶轮旋转在3D上的应用. 在3D拓扑上可以创建各种各样的图元,在HT for Web ...

  7. 基于HT for Web矢量实现HTML5文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  8. 基于HT for Web的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  9. 基于HT for Web 3D呈现Box2DJS物理引擎

    上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是 ...

随机推荐

  1. HDU 1066 Last non-zero Digit in N!(数论,大数,wait)

    The expression N!, read as "N factorial," denotes the product of the first N positive inte ...

  2. Codeforces #427 Div2 D

    #427 Div2 D 题意 给出一个字符串,求它的子串中为 \(k-palindrome\) 的个数. \(1-palindrome\) 要求是一个回文串. \(k-palindrome (k &g ...

  3. Java 反射调用的一种优化

    写一些Java框架的时候,经常需要通过反射get或者set某个bean的field,比较普通的做法是获取field后调用java.lang.reflect.Field.get(Object),但每次都 ...

  4. Exercise02_05

    import java.util.Scanner; public class Rate { public static void main(String[] args){ Scanner input ...

  5. Mac sublime 编译Python UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-8: ordinal not in range(128)

    刚学Python,想打印个“hello 张林峰”,代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- print('hello 张林峰') 用su ...

  6. 【java JVM】JVM中类的加载,加载class文件的原理机制

    暂时贴图一张,以后补充 解释: 1.符号引用替换为直接引用[参考:http://blog.csdn.net/maerdym/article/details/8087620] 在java中,一个java ...

  7. golang构造单链表

    原文地址:http://www.niu12.com/article/47package main import "fmt" type ListNode struct { Value ...

  8. gin框架中间件解决跨域问题

    http://www.niu12.com/article/45// 初始化routerrouter := gin.New() router.Use(gin.Logger()) router.Use(g ...

  9. CentOS7.x 通过mail命令发,使用465端口(smtps协议)发送邮件

    #创建证书mkdir -p /root/.certs/echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CE ...

  10. Actionscript 3 自定义 matedata

    metadata就是元数据 反应一个类本质的属性 可以通过describeType(obj)来得到反应该对象的xml 要自定义元数据,如[MyMatedata()] package {  public ...