基于DJango和Pybind11,实现网络后端调用OpenCV算法

2021-01-08 08:30

阅读:829

本Blog来源于实际项目,所采用框架组合中,OpenCV实现算法主体、pybind11完成OpenCV的Python封装、django提供Web应用服务,三者协同配合,共同实现网络后端调用OpenCV算法,解决特定问题”的目标。

由于pybind11在windows和在linux下的部署安装,都已经分别专门撰文,基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS) 基于pybind11实现Python调用c++编写的CV算法--下 (Linux+Cmake)
 
本文以django的配置和整体集成为重心。最终调用的OpenCV算法,也以GOWarper来表示。
 

一、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 startapp goApp
启动项目:python3 manage.py runserver 8080

wsgi.py:全称 webserver getway interface,即Web服务器的网关接口

技术图片

urls.py:即路由配置

django下所有的页面都需要urls文件中配置一下,否则在访问的时候会找不到该文件。

技术图片

 

settings.py:

配置文件,各种路径、国际化、debug、模版等均在此文件中配置。

 

 

三、简单示例

 

我了进一步加速对相关知识的理解,我们创建一个最为简单的程序,它能够实现的就是读取并显示当前系统OpenCV版本。我们需要改写以下文件:

url控制器 url.py

from django.contrib import admin
from django.urls import path
from goApp import views

urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘index/‘,views.index),
]
视图 view.py
from django.shortcuts import render
from django.http import HttpResponse
import cv2

def index(request):
    return HttpResponse(cv2.__version__ )
 
以上代码中,标红的部分代表是新添加的,代码修改后,djangon会自动更新。运行结果如下:
技术图片
需要注意到,goApp是我们新创建的app的名称,这里相当于在主目录中,引用我们的新编模块。
如果能够运行到这一步,那么证明OpenCV相关的引入工作已经没有问题。

 

四、融合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)

 

 

技术图片

其中

sys.path.append("/home/helu/sandbox/GOPyWarper0430/demo/bin")

就是制定GOPyWarper0430的具体位置。

五、后端调用优缺点分析

       优势是极大程度地扩展了OpenCV的使用范围,在以前图像算法大多是运行在PC机上面,通过这种方式,能够非常方便地在手机等消费类电器上进行部署,但是也需要进一步就时延和并发进行相关研究;后端调用能够比较方便地集成复杂和自研算法,对于实际项目来说很有帮助。

        这种方法的缺点是可想而知的性能问题,因为OpenCV通过Python调用,再通过Django变成网络服务,这里面很多环节都是瓶颈,那么在实际项目过程中都需要在各个节点关口去做性能优化。

感谢阅读至此,希望有所帮助。

 


评论


亲,登录后才可以留言!