基于DJango和Pybind11,实现网络后端调用OpenCV算法
2021-01-08 08:30
本Blog来源于实际项目,所采用框架组合中,OpenCV实现算法主体、pybind11完成OpenCV的Python封装、django提供Web应用服务,三者协同配合,共同实现“网络后端调用OpenCV算法,解决特定问题”的目标。
一、Django的下载和测试
1、在管理员权限下,直接可以使用pip进行安装。
pip3 install django
如果网络正常,那么可以通过
pip3 show django
查看django版本和django安装路径:
2、创建一个django project
在空文件夹下,使用以下命令创建django project
django-admin.py startproject mysites
我们可以使用vscode来查看,其中较为关键的几项:
manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
urls.py ----- 负责把URL模式映射到应用程序。
|
需要注意的是,这里的几个py都是行使管理权限的。
3、在mysites目录下创建应用(app)
python3 manage.py startapp goApp
这新建一个goApp的实际项目,这个实际的项目是可以被启动的。
4、启动django项目
python3 manage.py runserver 8080
这样,我们的django就启动起来了。当我们访问http://127.0.0.1:8080/时,可以看到
如果以上工作全部能够成功,那么证明Djangon的下载安装是成功的,下面我们来具体理解其相关内容。
二、文件结构和各种作用
manage.py文件位于整个项目的最外层,是该项目的项目管理器,通过不指定命令运行,可以发现它具备以下功能。
比如,我们在上面使用过的:
启动项目:python3 manage.py runserver 8080
wsgi.py:全称 webserver getway interface,即Web服务器的网关接口
urls.py:即路由配置
django下所有的页面都需要urls文件中配置一下,否则在访问的时候会找不到该文件。
settings.py:
配置文件,各种路径、国际化、debug、模版等均在此文件中配置。
三、简单示例
我了进一步加速对相关知识的理解,我们创建一个最为简单的程序,它能够实现的就是读取并显示当前系统OpenCV版本。我们需要改写以下文件:
url控制器 url.py
from django.urls import path
from goApp import views
urlpatterns = [
path(‘admin/‘, admin.site.urls),
path(‘index/‘,views.index),
]
from django.http import HttpResponse
import cv2
def index(request):
return HttpResponse(cv2.__version__ )
四、融合GOWarper
在pybind11中,我们已经比较清楚地说明了如何使用python调用opencv算法。在我实际配置过程中,主要是遇到了路径配置问题。之前是将GOWarper*.so和*.py放在同一个目录下面,这对于测试或者单机来说可行;但是对于服务器来说往往不可行。解决方法是在引入中强制指定后头文件中引入GOPyWarper地址:比如以下目录:
from django.shortcuts import render
from django.http import HttpResponse
import sys;
sys.path.append("/home/helu/sandbox/GOPyWarper0430/demo/bin")
import cv2
import GOPyWarper
def index(request):
src = cv2.imread(‘/home/helu/sandbox/GOPyWarper0430/demo/pip.jpg‘,1)
rows,cols,ch=src.shape
varCircles = GOPyWarper.GO_FindPips(src)
return HttpResponse(varCircles)
其中
就是制定GOPyWarper0430的具体位置。
五、后端调用优缺点分析
优势是极大程度地扩展了OpenCV的使用范围,在以前图像算法大多是运行在PC机上面,通过这种方式,能够非常方便地在手机等消费类电器上进行部署,但是也需要进一步就时延和并发进行相关研究;后端调用能够比较方便地集成复杂和自研算法,对于实际项目来说很有帮助。
这种方法的缺点是可想而知的性能问题,因为OpenCV通过Python调用,再通过Django变成网络服务,这里面很多环节都是瓶颈,那么在实际项目过程中都需要在各个节点关口去做性能优化。
感谢阅读至此,希望有所帮助。
上一篇:vscode搭建c语言环境
下一篇:七大排序之冒泡排序
文章标题:基于DJango和Pybind11,实现网络后端调用OpenCV算法
文章链接:http://soscw.com/essay/40886.html