本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

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

如果网络正常,那么可以通过

    pip3 show django

查看django版本和django安装路径:

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

2、创建一个django project

在空文件夹下,使用以下命令创建django project

    django-admin.py startproject mysites

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

我们可以使用vscode来查看,其中较为关键的几项:

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

manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。



settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。



urls.py ----- 负责把URL模式映射到应用程序。   

需要注意的是,这里的几个py都是行使管理权限的。

3、在mysites目录下创建应用(app)

    python3 manage.py startapp goApp

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

这新建一个goApp的实际项目,这个实际的项目是可以被启动的。

4、启动django项目

    python3 manage.py runserver 8080

    这样,我们的django就启动起来了。当我们访问http://127.0.0.1:8080/时,可以看到

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

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

如果以上工作全部能够成功,那么证明Djangon的下载安装是成功的,下面我们来具体理解其相关内容。

 

二、文件结构和各种作用

manage.py文件位于整个项目的最外层,是该项目的项目管理器,通过不指定命令运行,可以发现它具备以下功能。

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

比如,我们在上面使用过的:



创建应用:python3 manage.py startapp goApp
启动项目:python3 manage.py runserver 8080



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

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

urls.py:即路由配置

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

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

 

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会自动更新。运行结果如下:



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



需要注意到,goApp是我们新创建的app的名称,这里相当于在主目录中,引用我们的新编模块。



如果能够运行到这一步,那么证明OpenCV相关的引入工作已经没有问题。



 

四、融合GOWarper

 

在pybind11中,我们已经比较清楚地说明了如何使用python调用opencv算法。在我实际配置过程中,主要是遇到了路径配置问题。之前是将GOWarper*.so和*.py放在同一个目录下面,这对于测试或者单机来说可行;但是对于服务器来说往往不可行。解决方法是在引入中强制指定后头文件中引入GOPyWarper地址:比如以下目录:

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

 

 



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)



 

 



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



其中



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



​就是制定GOPyWarper0430的具体位置。​

五、后端调用优缺点分析

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

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

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

 



 


本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

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

如果网络正常,那么可以通过

    pip3 show django

查看django版本和django安装路径:

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

2、创建一个django project

在空文件夹下,使用以下命令创建django project

    django-admin.py startproject mysites

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

我们可以使用vscode来查看,其中较为关键的几项:

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

manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。



settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。



urls.py ----- 负责把URL模式映射到应用程序。   

需要注意的是,这里的几个py都是行使管理权限的。

3、在mysites目录下创建应用(app)

    python3 manage.py startapp goApp

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

这新建一个goApp的实际项目,这个实际的项目是可以被启动的。

4、启动django项目

    python3 manage.py runserver 8080

    这样,我们的django就启动起来了。当我们访问http://127.0.0.1:8080/时,可以看到

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

如果以上工作全部能够成功,那么证明Djangon的下载安装是成功的,下面我们来具体理解其相关内容。

 

二、文件结构和各种作用

manage.py文件位于整个项目的最外层,是该项目的项目管理器,通过不指定命令运行,可以发现它具备以下功能。

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

比如,我们在上面使用过的:



创建应用:python3 manage.py startapp goApp
启动项目:python3 manage.py runserver 8080



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

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

urls.py:即路由配置

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

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

 

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会自动更新。运行结果如下:



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



需要注意到,goApp是我们新创建的app的名称,这里相当于在主目录中,引用我们的新编模块。



如果能够运行到这一步,那么证明OpenCV相关的引入工作已经没有问题。



 

四、融合GOWarper

 

在pybind11中,我们已经比较清楚地说明了如何使用python调用opencv算法。在我实际配置过程中,主要是遇到了路径配置问题。之前是将GOWarper*.so和*.py放在同一个目录下面,这对于测试或者单机来说可行;但是对于服务器来说往往不可行。解决方法是在引入中强制指定后头文件中引入GOPyWarper地址:比如以下目录:

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

 

 



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)



 

 



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



其中



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



​就是制定GOPyWarper0430的具体位置。​

五、后端调用优缺点分析

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

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

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

 



 

1、在管理员权限下,直接可以使用pip进行安装。

    pip3 install django

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

如果网络正常,那么可以通过

    pip3 show django

查看django版本和django安装路径:

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

2、创建一个django project

在空文件夹下,使用以下命令创建django project

    django-admin.py startproject mysites

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

我们可以使用vscode来查看,其中较为关键的几项:

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

manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。



settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。



urls.py ----- 负责把URL模式映射到应用程序。   

需要注意的是,这里的几个py都是行使管理权限的。

3、在mysites目录下创建应用(app)

    python3 manage.py startapp goApp

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

这新建一个goApp的实际项目,这个实际的项目是可以被启动的。

4、启动django项目

    python3 manage.py runserver 8080

    这样,我们的django就启动起来了。当我们访问http://127.0.0.1:8080/时,可以看到

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

如果以上工作全部能够成功,那么证明Djangon的下载安装是成功的,下面我们来具体理解其相关内容。

 

二、文件结构和各种作用

manage.py文件位于整个项目的最外层,是该项目的项目管理器,通过不指定命令运行,可以发现它具备以下功能。

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

比如,我们在上面使用过的:



创建应用:python3 manage.py startapp goApp
启动项目:python3 manage.py runserver 8080



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

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

urls.py:即路由配置

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

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

 

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会自动更新。运行结果如下:



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



需要注意到,goApp是我们新创建的app的名称,这里相当于在主目录中,引用我们的新编模块。



如果能够运行到这一步,那么证明OpenCV相关的引入工作已经没有问题。



 

四、融合GOWarper

 

在pybind11中,我们已经比较清楚地说明了如何使用python调用opencv算法。在我实际配置过程中,主要是遇到了路径配置问题。之前是将GOWarper*.so和*.py放在同一个目录下面,这对于测试或者单机来说可行;但是对于服务器来说往往不可行。解决方法是在引入中强制指定后头文件中引入GOPyWarper地址:比如以下目录:

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

 

 



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)



 

 



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



其中



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



​就是制定GOPyWarper0430的具体位置。​

五、后端调用优缺点分析

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

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

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