
使用NestJS和Prisma构建REST API:身份验证
在信息化飞速发展的今天,文档OCR(Optical Character Recognition,光学字符识别)技术已成为连接纸质文档与数字世界的桥梁。无论是企业档案、个人笔记,还是各类合同与发票,OCR技术都能轻松将图像中的文字转化为可编辑、可搜索的文本。本文将带您深入探索如何结合OpenCV与百度OCR API,构建一套高效、准确的文档OCR识别系统。
随着数字化办公的普及,纸质文档的处理需求日益增加。传统的手动输入方式不仅耗时费力,还容易出错。而OCR技术则能够自动从图像中提取文字信息,极大地提高了工作效率。本项目旨在通过OpenCV进行图像处理,结合百度OCR API的文字识别能力,实现一个简单、实用且高效的文档OCR识别系统。
图像预处理是OCR识别的关键步骤之一。为了获得更好的识别效果,我们需要对原始图像进行一系列处理,以提取出文档的有效区域。
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) # 轮廓近似
在确定了文档的边缘后,我们需要根据边缘的四点确定文档的区域,并利用透射变换将文档视角转换为正视图。
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)
(注:此时代码执行后,将得到一个透视变换后的图像。由于文本限制,无法直接展示图片,但读者可以在本地运行代码并查看结果。)
在完成图像预处理和文档区域确定后,我们调用百度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识别的结果,包括识别出的文字和对应的置信度。同样地,由于文本限制,无法直接展示识别结果,但读者可以在本地运行代码并查看输出结果。)
通过本项目的实现,我们成功地将一张包含文字的文档图像转换为可编辑的电子文本。以下是本项目的一些关键效果展示:
(注:由于文本限制,无法直接展示原始图像。读者可以想象或自行准备一张文档图像。)
(注:同样地,由于文本限制,无法直接展示预处理后的图像。但读者可以在本地运行代码并查看结果。)
(注:读者可以在本地运行代码并查看识别结果。)
通过本项目的实践,我们掌握了利用OpenCV进行图像预处理、结合百度OCR API进行文字识别的关键技术。同时,我们也深刻体会到了OCR技术在数字化办公
本文章转载微信公众号@讳疾忌医-note