python在线识别文字(基于Python实现在线OCR文字识别系统)(1)

ocr简介

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。

随着云计算,大数据和AI技术的快速发展,OCR技术也相对比较成熟。在网络中也可以很方便地找到OCR识别软件,不管是离线工具还是在线识别,OCR识别率还是蛮高的。

一个普通的OCR识别软件大致的工作流程如下:

  1. 影像输入;
  2. 影像前处理;
  3. 文字特征抽取;
  4. 比对识别;
  5. 人工校正;
  6. 结果输出;

对待识别图像进行如下预处理,可以降低特征提取算法的难度,并能提高识别的精度:

python在线识别文字(基于Python实现在线OCR文字识别系统)(2)

开发OCR在线识别系统

下面我们通过python开发一个OCR在线识别系统,该系统提供一个简单的web界面,支持上传一张包含中文字符的图片,经过系统的识别后,可以提取出图片中包含的文字,并将文字输出到web界面。

OCR在线识别系统特性:

下面我们简单介绍下OCR在线识别系统的核心代码

python版本信息如下:

python.exe --version Python 3.8.6

安装系统所依赖的python库:

pip install easyocr pip install twisted pip install logging pip install django

OCR engine核心代码:

#!/usr/bin/python # -*- coding: UTF-8 -*- import sys, getopt import logging from abc import ABC import easyocr from twisted.internet import reactor from twisted.internet.protocol import Serverfactory from twisted.protocols.basic import LineReceiver logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def server(port): class SimpleServerFactory(ServerFactory): reader = None def __init__(self, reader): self.reader = reader class SimpleReceiver(LineReceiver, ABC): def connectionMade(self): logger.info('Got connection from %s', self.transport.client) def connectionLost(self, reason): logger.info('%s disconnected', self.transport.client) def dataReceived(self, data): if type(data) == bytes: logger.info("Received data ...") else: logger.info("Received data:%s", data) result = reader.readtext(data, detail=0) str = ''; for item in result: str = str item self.sendLine(str.encode()) logger.info("Send response: %s", str) # need to run only once to load model into memory reader = easyocr.Reader(['ch_sim', 'en']) factory = SimpleServerFactory(reader) factory.protocol = SimpleReceiver reactor.listenTCP(port, factory) logger.info("TCP server started on port(s): %s ..." % (port)) reactor.run() def main(argv): port = 0 if len(argv) == 0: print('usage: ocr_server.py -p <port>') sys.exit(1) try: opts, args = getopt.getopt(argv, "?hp:", ["port="]) except getopt.GetoptError: print('usage: ocr_server.py -p <port>') sys.exit(2) if len(opts) == 0: print('usage: ocr_server.py -p <port>') sys.exit(3) for opt, arg in opts: if opt == '-h': print('usage: ocr_server.py -p <port>') sys.exit() elif opt in ("-p", "--port"): port = arg else: print('usage: ocr_server.py -p <port>') sys.exit(4) if int(port) == 0: print('usage: ocr_server.py -p <port>') sys.exit(5) server(int(port)) if __name__ == '__main__': main(sys.argv[1:])

如何启动OCR engine呢?

python.exe ocr_engine.py usage: ocr_engine.py -p <port>

-p是指OCR engine所使用的端口号;

python.exe ocr_engine.py -p 8001 2020-11-04 18:08:23,224 - easyocr.easyocr - WARNING - CUDA not available - defaulting to CPU. Note: This module is much faster with a GPU. 2020-11-04 18:08:26,092 - __main__ - INFO - TCP server started on port(s): 8001 ...

这样就启动了一个在8001端口监听的OCR engine服务。

python在线识别文字(基于Python实现在线OCR文字识别系统)(3)

使用Django构建一个Web应用

urls.py

urlpatterns = [ path('', views.index), path('index.html', views.index), path('ocr.html', views.ocr) ]

html页面内容:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>OCR在线识别</title> <style type="text/css"> .upload_file { height: 100px; width: 800px; vertical-align:middle; } .upload_file form{ margin-top: 50px; margin-left: 50px; } .result { height: 100px; line-height: 100px; margin-left: 50px; font-size: 20px; } h2{ margin-top: 20px; margin-left: 50px; } </style> </head> <body> <h2>OCR在线识别系统</h2> <div class="upload_file"> <form action="/ocr.html" method="POST" enctype="multipart/form-data"> 上传图片: <input id="f" type="file" name="img"> <input type="hidden" name="csrf_token" value="{{ csrf_token }}" /> <input id="sub" type="submit" value="文字识别"> </form> </div> <div class="result"> <b>识别结果:</b> <b>{{ result }}</b> </div> </body> </html>

views.py

def index(request): result = "" return render(request, "index.html", {"result": result}) def ocr(request): tcp_client_socket = socket(AF_INET, SOCK_STREAM) tcp_client_socket.connect(('localhost', 9000)) img = request.FILES.get("img") data = img.read() tcp_client_socket.send(data) # 此处与udp不同,客户端已经知道消息来自哪台服务器,不需要用recvfrom了 recv_data = tcp_client_socket.recv(1024) result = recv_data.decode('utf-8') tcp_client_socket.close() return render(request, "index.html", {"result": result})

验证OCR识别效果

分别启动OCR engine和Django应用

python.exe ocr_engine.py -p 9000

在9000端口启动OCR engine。

python.exe manage.py runserver 8000 Run 'python manage.py migrate' to apply them. November 06, 2020 - 16:04:55 Django version 3.1.3, using settings 'ocr-demo.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.

在8000端口启动Django系统。

python在线识别文字(基于Python实现在线OCR文字识别系统)(4)

在浏览器地址栏输入:http://localhost:8000

上传图片界面:

python在线识别文字(基于Python实现在线OCR文字识别系统)(5)

识别后效果:

python在线识别文字(基于Python实现在线OCR文字识别系统)(6)

测试图片:

python在线识别文字(基于Python实现在线OCR文字识别系统)(7)

视频演示效果:

如果您对本项目感兴趣,欢迎关注作者并后台私信“OCR”关键字,获取本项目源代码地址。

不积跬步,无以至千里;不积小流,无以成江海!

,