使用NestJS和Prisma构建REST API:身份验证
利用OpenCV与百度OCR API打造高效文档OCR识别系统
在信息化飞速发展的今天,文档OCR(Optical Character Recognition,光学字符识别)技术已成为连接纸质文档与数字世界的桥梁。无论是企业档案、个人笔记,还是各类合同与发票,OCR技术都能轻松将图像中的文字转化为可编辑、可搜索的文本。本文将带您深入探索如何结合OpenCV与百度OCR API,构建一套高效、准确的文档OCR识别系统。
一、项目背景与目标
随着数字化办公的普及,纸质文档的处理需求日益增加。传统的手动输入方式不仅耗时费力,还容易出错。而OCR技术则能够自动从图像中提取文字信息,极大地提高了工作效率。本项目旨在通过OpenCV进行图像处理,结合百度OCR API的文字识别能力,实现一个简单、实用且高效的文档OCR识别系统。
二、技术选型与工具介绍
- 1. OpenCV:OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理与分析功能。在本项目中,我们将利用OpenCV进行图像的预处理,包括灰度转换、边缘检测、轮廓提取以及透射变换等,以提取出文档的有效区域。
- 2. 百度OCR API:百度OCR API是百度提供的一项高性能文字识别服务,支持多种语言与字符集的识别。通过调用百度OCR API,我们可以轻松实现图像中文字的自动提取与转换。
三、项目实现步骤
1. 图像预处理
图像预处理是OCR识别的关键步骤之一。为了获得更好的识别效果,我们需要对原始图像进行一系列处理,以提取出文档的有效区域。
- • 读取图像:首先,我们使用OpenCV读取原始图像,并进行缩放处理以适应后续处理。
- • 灰度转换:将彩色图像转换为灰度图像,以减少计算量并突出图像中的边缘信息。
- • 边缘检测:利用Canny边缘检测算法检测图像中的边缘信息。
- • 轮廓提取:通过轮廓检测算法提取出图像中的闭合轮廓,并选择面积最大的闭合轮廓作为文档的边缘。
import cv2 as cv
import numpy as np
# 读取图像
img = cv.imread('document.jpg', cv.IMREAD_COLOR)
org = img.copy()
ratio =0.4# 缩放比例
img = cv.resize(img, dsize=None, fx=ratio, fy=ratio)
# 灰度转换
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 边缘检测
edged = cv.Canny(gray,75,200)
# 轮廓提取
cnts, hierarchy = cv.findContours(edged.copy(), cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
cnt =sorted(cnts, key=cv.contourArea, reverse=True)[0]# 面积最大的轮廓
peri = cv.arcLength(cnt,True)# 计算周长
approx = cv.approxPolyDP(cnt,0.1* peri,True) # 轮廓近似
2. 文档区域确定与透射变换
在确定了文档的边缘后,我们需要根据边缘的四点确定文档的区域,并利用透射变换将文档视角转换为正视图。
- • 排序轮廓点:通过计算x+y的最小值和最大值来确定A、C点,通过计算y-x的最小值和最大值来确定B、D点。然后,将这四个点按照顺时针或逆时针顺序排列。
- • 透射变换:利用排列好的四个点进行透射变换,将文档区域转换为正视图。
def order_points(pts):
rect = np.zeros((4,2), dtype="float32")
s = pts.sum(axis=1)
rect[0]= pts[np.argmin(s)]
rect[2]= pts[np.argmax(s)]
diff = np.diff(pts, n=1, axis=1)
rect[1]= pts[np.argmin(diff)]
rect[3]= pts[np.argmax(diff)]
return rect
deffour_point_transform(image, pts):
rect = order_points(pts)
len= np.zeros((4,1))
for i, p inenumerate(rect):
if i !=3:
x = rect[i:(i +2),0]
y = rect[i:(i +2),1]
else:
x =[rect[3,0], rect[0,0]]
y =[rect[3,1], rect[0,1]]
len[i]= np.sqrt(((x[0]- x[1])**2+(y[0]- y[1])**2))
maxWidth =int(max(len[0],len[2]))
maxHight =int(max(len[1],len[3]))
dst = np.array([[0,0],[maxWidth -1,0],[maxWidth -1, maxHight -1],[0, maxHight -1]], dtype="float32")
M = cv.getPerspectiveTransform(rect, dst)
warped = cv.warpPerspective(image, M,(maxWidth, maxHight))
return warped
warped = four_point_transform(org, approx.reshape(4,2)/ ratio)
(注:此时代码执行后,将得到一个透视变换后的图像。由于文本限制,无法直接展示图片,但读者可以在本地运行代码并查看结果。)
3. 文字识别
在完成图像预处理和文档区域确定后,我们调用百度OCR API进行文字识别。
- • 申请OCR API密钥:首先,我们需要在百度智能云平台上申请OCR API的AppID、API Key和Secret Key。
- • 创建AipOcr客户端:利用申请到的密钥创建一个AipOcr客户端实例。
- • 读取预处理后的图像:将预处理后的图像转换为字节流,以便上传给百度OCR API进行识别。
- • 调用OCR API:设置识别参数(如语言类型、检测方向等),并调用百度OCR API进行文字识别。
- • 处理识别结果:接收并处理OCR API返回的识别结果,提取出文档中的文字信息。
from aip importAipOcr
# 初始化AipOcr
APP_ID ='你的AppID'
API_KEY ='你的API_Key'
SECRET_KEY ='你的Secret_Key'
client =AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 读取图像并转换为字节流
defget_file_content(filepath):
withopen(filepath,'rb')as fp:
return fp.read()
image_path ='预处理后的图像路径'# 注意替换为实际路径
image = get_file_content(image_path)
# 调用OCR API进行文字识别
options ={}
options["language_type"]="CHN_ENG"# 中英文识别
options["detect_direction"]="true"# 检测图像方向
options["detect_language"]="true"# 检测语言
options["probability"]="true"# 返回识别概率
res = client.basicGeneral(image, options)
# 打印识别结果
if'words_result'in res:
for item in res['words_result']:
print(f"识别出的文字: {item['words']}, 置信度: {item['confidence']}")
else:
print("未识别到文字")
(注:此时代码执行后,将打印出OCR识别的结果,包括识别出的文字和对应的置信度。同样地,由于文本限制,无法直接展示识别结果,但读者可以在本地运行代码并查看输出结果。)
四、项目效果展示
通过本项目的实现,我们成功地将一张包含文字的文档图像转换为可编辑的电子文本。以下是本项目的一些关键效果展示:
- 1. 原始图像:一张包含文字的文档图像,可能包含背景、噪音等干扰因素。
(注:由于文本限制,无法直接展示原始图像。读者可以想象或自行准备一张文档图像。)
- 1. 预处理后的图像:经过边缘检测、轮廓提取和透射变换后,文档区域被成功提取并转换为正视图。此时,图像中的文字更加清晰、易于识别。
(注:同样地,由于文本限制,无法直接展示预处理后的图像。但读者可以在本地运行代码并查看结果。)
- 1. OCR识别结果:调用百度OCR API后,文档中的文字被成功识别并转换为电子文本。识别结果中包含了每个识别出的文字及其对应的置信度。
(注:读者可以在本地运行代码并查看识别结果。)
五、项目总结与优化建议
通过本项目的实践,我们掌握了利用OpenCV进行图像预处理、结合百度OCR API进行文字识别的关键技术。同时,我们也深刻体会到了OCR技术在数字化办公
本文章转载微信公众号@讳疾忌医-note