博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于tornado实现web camera
阅读量:6237 次
发布时间:2019-06-22

本文共 3104 字,大约阅读时间需要 10 分钟。

基于tornado实现web camera


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

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

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

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

import tornado.ioloopimport tornado.webimport tornado.genimport cv2from tornado.options import define,  optionsdefine("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('
' 'Name:
' '
' '
') 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实现自己主动的刷新。

项目地址:

无图无真相:

此处输入图片的描写叙述

你可能感兴趣的文章
我的第三篇博客(激动激动真激动!!!)A-B Problem
查看>>
C/C++二维数组名和二级指针
查看>>
jsf
查看>>
java代码输入流篇2
查看>>
python(50):python 向上取整 ceil 向下取整 floor 四舍五入 round
查看>>
电话聊天狂人
查看>>
性能测试随笔一(性能分析工具)
查看>>
ArcGIS Server的安装步骤
查看>>
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
查看>>
字符串截取
查看>>
进来看看吧 多学点知识不亏.......
查看>>
关于Hibernate框架的面试题
查看>>
Hdoj 1002
查看>>
paper 116:自然图像抠图/视频抠像技术梳理(image matting, video matting)
查看>>
类的析构、继承
查看>>
JNI在eclipse中出现Unresolved inclusion: <jni.h>或Type 'jint' could not be resolved等解决方法...
查看>>
Asp.Net Web配置连接字符串加密
查看>>
转 Apache Ant 实现自动化部署
查看>>
XML 基本语法
查看>>
CentOS6.5_64位系统下安装配置postfix邮件系统 启用并配置SMTP在第三方上边使用发送邮件...
查看>>