Python Web: Django REST项目实战 后端开发
技术原理
为了实现中文字符识别,本章采用开源库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'), ]
保存所有修改后启动项目。
下载安装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,上传图片,