Python Web: Django REST项目实战 后端开发

来自CloudWiki
跳转至: 导航搜索

技术原理

为了实现中文字符识别,本章采用开源库Tesseract-OCR来进行文字识别任务,

它是惠普实验室开发的一个开源字符识别引擎。

下载地址为https://digi.bib.uni-mannheim.de/tesseract/

如果是windows 64位系统,下载tesseract-ocr-w64-setup-v4.1.0.20190314.exe

实训步骤

静态文件服务

一般情况下,采用前后端分离机制后,前端静态资源(html,css,jpg)会采用额外的前端服务器来提供静态文件服务。

这里为了简化服务器的搭建与使用,依然使用django来提供静态文件服务,

将所有的静态资源(html,css,jpg)等按照文件夹路径创建对应的视图处理函数。

在views.py中添加代码:


def read_css(request, filename):
    with open('frontend/css/{}'.format(filename), 'rb') as f:
        css_content = f.read()
    print('css文件')
    return HttpResponse(content=css_content, content_type='text/css')


def read_js(request, filename):
    with open('frontend/js/{}'.format(filename), 'rb') as f:
        js_content = f.read()
    print('js文件')
    return HttpResponse(content=js_content,
                        content_type='application/JavaScript')


def read_img(request, filename):
    with open('frontend/img/{}'.format(filename), 'rb') as f:
        img_content = f.read()
    print('img文件')
    return HttpResponse(content=img_content, content_type='image/jpeg')

上述代码分别创建js,css 和jpg文件访问的视图处理函数。

同时,重写home函数:

def home(request):
    with open('frontend/index.html', 'rb') as f:
        html = f.read()
    return HttpResponse(html)


设置访问路由

urls.py:

from django.urls import path
from app.views import home
from app.views import read_css, read_js, read_img

urlpatterns = [
    path('', home, name='home'),
    path('css/<str:filename>', read_css, name='read_css'),
    path('js/<str:filename>', read_js, name='read_js'),
    path('img/<str:filename>', read_img, name='read_img'),

]

保存所有修改后启动项目。

输入网址:http://127.0.0.1:8000

Python21061302.png

下载安装Tesseract

下载地址为https://digi.bib.uni-mannheim.de/tesseract/

如果是windows 64位系统,下载tesseract-ocr-w64-setup-v4.1.0.20190314.exe

下载完成后双击进入安装页面,展开Adddtional language data,

勾选Arabic 和Chinese simplified复选框,使得能够支持阿拉伯数字和简体中文。

安装python依赖包

为了能够在python中使用该引擎库,需要安装对应的python库

pip install pytesseract

然后修改pytesseract库文件,在pytesseract安装包中找的pytesseract.py文件,修改pytesseract_cmd的值,将tesseractOCR的安装目录填入其中。

tesseract_cmd = r'<tesseractOCR的安装目录>\tesseract.exe'

通过上述修改,就可以使python能够找到本地的文字识别程序完成识别。

添加视图处理函数

views.py:


import numpy as np    
import urllib         
import json          
import cv2          
import pytesseract
from PIL import Image
import os  
from django.views.decorators.csrf import csrf_exempt 
from django.http import JsonResponse  

def read_image(stream=None):
    data_temp = stream.read()
    image = np.asarray(bytearray(data_temp), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    return image

@csrf_exempt  # 用于规避跨站点请求攻击
def ocrDetect(request):
    result = {"code": None}  
    if request.method == "POST":
        if request.FILES.get("image", None) is not None:  
            img = read_image(stream=request.FILES["image"])
        # OpenCV转PIL
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        # 执行识别
        code = pytesseract.image_to_string(img, lang='chi_sim')
        result.update({"output": code})
    return JsonResponse(result)

整体实现方式与人脸检测功能相似,

不同之处在于此处返回的结果是以JSON字符串形式给出,

不需要再进行额外的编码。

识别部分主要采用pytesseract.image_to_string()函数进行识别,其中lang='chi_sim'表示当前识别中文简体字符。

添加路由

urls.py:

from django.urls import path
from app.views import home
from app.views import read_css, read_js, read_img
from app.views import ocrDetect

urlpatterns = [
    ...
    path('ocr/', ocrDetect, name='ocrDetect'),  # 在线中文字符识别api
]

验证

打开127.0.0.1:8000,上传图片,

Python21061303.png