基于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. POJ 3083 Children of the Candy Corn (DFS + BFS + 模拟)

    题目链接:http://poj.org/problem?id=3083 题意: 这里有一个w * h的迷宫,给你入口和出口,让你分别求以下三种情况时,到达出口的步数(总步数包括入口和出口): 第一种: ...

  2. 操作JSON————精品

    使用背景: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原 ...

  3. POJ 2482 Stars in Your Window(扫描线+线段树)

    [题目链接] http://poj.org/problem?id=2482 [题目大意] 给出一些点的二维坐标和权值,求用一个长H,宽W的矩形能框住的最大权值之和, 在矩形边缘的点不计算在内 [题解] ...

  4. Spring学习——DI(依赖注入)

    IOC容器,处理对象依赖关系 IOC与DI: IOC :是一个容器,创建对象的容器 DI :在容器创建对象后,处理对象的依赖关系,也叫依赖注入! 方式1:通过set方法注入值 可以给普通属性.集合属性 ...

  5. Intellij IDEA光标保持自动缩进,设置下次不放在行首

  6. LongPathException问题解析

    一.背景      当windows系统下使用System.IO命名空间下的方法,目录长度超过260个字符时,.net framework会抛出LongPathException.查阅相关资料,发现是 ...

  7. ntp流量放大攻击分析

    最近,听说挂在网络上的设备进行时间同步成功率低,YS需要架设自己的NTP服务器,这玩意第一时间能让人想到NTP流量放大攻击,这也是一种比较古老的攻击方式,检测了一下发现所使用的OS默认已经进行了加固, ...

  8. RMAN 备份恢复 删除表空间后控制文件丢失

    先备份一个控制文件 RMAN> backup current controlfile tag='bak_ctlfile' format='/home/oracle/backup/bak_ctl_ ...

  9. Lucene的学习及使用实验

    实验一下Lucene是怎么使用的. 参考:http://www.importnew.com/12715.html (例子比较简单) http://www.yiibai.com/lucene/lucen ...

  10. Java Web---登录验证和字符编码过滤器

    什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...