基于tornado实现web camera

基于tornado实现web camera



最近在学习python,找了一个框架学习,我选择的是tornado,因为其不只是一个web开发框架,其还是一个服务器,异步事件库,一举多得。

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

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

下面为整个工程的文件内容:

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

无图无真相:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 15:08:21

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

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

Nginx是一个高效的Web服务器及代理服务器,Tornado是一个基于epoll的异步Web开发框架,通常使用Nginx做为Web服务器时,都会以FastCGI模式,而我们从开发.调试.运维的角度考虑,使用了反向代理的模式,同时Nginx可以做一些特殊业务和负载均衡的处理. 其实反向代理模式很简单,Nginx监听在80端口,做为Web服务端口,而Tornado的Web服务进程监听在808*的内部端口(可以启动多个进程),使用supervisor对Nginx.Tornado服务进程进行统一的管理

基于Tornado自定制仿Django的Session以及Form组件

一.session 1.Session本质是保存在服务器端的数据,可以看作是键值对. 用户第一次打开网站页面 - 生成一段随机字符串,作为value发给客户端浏览器,客户端带着字符串获取对应的session - 在session中保存,随机字符串作为key,value={'user':'Mitsui','pwd':123....} 2.session模块代码: import time import hashlib import settings def get_random_str(): "&q

《Flask Web开发 基于Python的Web应用开发实战》简评

指路牌 <Flask Web开发><Flask Web开发 基于Python的Web应用开发实战><Flask Web开发>是否适合新手入门Python Web开发? 正文 <Flask Web开发 基于Python的Web应用开发实战>,O'Reilly"动物书系列"的"狗书",应该是很多Flask初学者被推荐使用的入门书,但是这本书真的适合初学者吗? Python的Web框架非常多,例如Django.Flask.T

linux学习笔记——搭建基于nginx的web服务器、多核配置、nginx配置参数

############ 认识nginx #############Nginx:(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用.  其优点是轻量级(占有内存少),高并发(并发能力强),事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用ngi

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

在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在<矢量Chart图表嵌入HTML5网络拓扑图的应用>一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条,我们先来看下效果图: 从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示

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

上篇我们基于HT for Web呈现了A* Search Algorithm的3D寻路效果,这篇我们将采用HT for Web 3D来呈现Box2DJS物理引擎的碰撞效果,同上篇其实Box2DJS只是二维的平面碰撞物理引擎,但同样通过3D的呈现能让人更直观的体验到碰撞效果,先上张最终例子效果图: Box2D最早是Erin Catto在GDC大会上的一个展示例子,后来不断完善成C++的开源物理引擎库,这些年了衍生出Java.ActionScript以及JS等版本,被广泛应用在游戏领域.说其丰富的确

基于Socket创建Web服务

基于Socket创建Web服务 为什么要使用Socket呢,我们来看下图 Socket原理图回顾: -------------------编写SocketService,完成字母小写转大写功能----------------------------- ServerSocket服务器端代码如下: public static void main(String[] args) throws IOException { // 1:建立服务器端的tcp socket服务,必须监听一个端口 ServerSo

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

在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在HTML5流行前VML和SVG算是真正纯种Web方案也是有不少应用,近些年随着HTML5的流行,加上移动终端对HTML5支持的普及,越来越多新项目开始采用真正纯HTML5的方案,更具体的说大数据量应用性能高于SVG的Canvas方案,已经逐渐成为当今Web SCADA前端技术的首选标配方案. htt

基于jQuery 常用WEB控件收集

Horizontal accordion: jQuery 基于jQuery开发,非常简单的水平方向折叠控件. Horizontal accordion: jQuery jQuery-Horizontal Accordion 具有XBOX360 blade界面风格的水平方向Accordion. jQuery-Horizontal Accordion AutoComplete-JQuery jQuery插件易于集成到现在的表单中(Form). AutoComplete-JQuery Facebook