安全的關(guān)鍵.png)
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
隨著數(shù)字化辦公的普及,紙質(zhì)文檔的處理需求日益增加。傳統(tǒng)的手動(dòng)輸入方式不僅耗時(shí)費(fèi)力,還容易出錯(cuò)。而OCR技術(shù)則能夠自動(dòng)從圖像中提取文字信息,極大地提高了工作效率。本項(xiàng)目旨在通過(guò)OpenCV進(jìn)行圖像處理,結(jié)合百度OCR API的文字識(shí)別能力,實(shí)現(xiàn)一個(gè)簡(jiǎn)單、實(shí)用且高效的文檔OCR識(shí)別系統(tǒng)。
圖像預(yù)處理是OCR識(shí)別的關(guān)鍵步驟之一。為了獲得更好的識(shí)別效果,我們需要對(duì)原始圖像進(jìn)行一系列處理,以提取出文檔的有效區(qū)域。
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)
# 灰度轉(zhuǎn)換
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 邊緣檢測(cè)
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)# 計(jì)算周長(zhǎng)
approx = cv.approxPolyDP(cnt,0.1* peri,True) # 輪廓近似
在確定了文檔的邊緣后,我們需要根據(jù)邊緣的四點(diǎn)確定文檔的區(qū)域,并利用透射變換將文檔視角轉(zhuǎn)換為正視圖。
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)
(注:此時(shí)代碼執(zhí)行后,將得到一個(gè)透視變換后的圖像。由于文本限制,無(wú)法直接展示圖片,但讀者可以在本地運(yùn)行代碼并查看結(jié)果。)
在完成圖像預(yù)處理和文檔區(qū)域確定后,我們調(diào)用百度OCR API進(jìn)行文字識(shí)別。
from aip importAipOcr
# 初始化AipOcr
APP_ID ='你的AppID'
API_KEY ='你的API_Key'
SECRET_KEY ='你的Secret_Key'
client =AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 讀取圖像并轉(zhuǎn)換為字節(jié)流
defget_file_content(filepath):
withopen(filepath,'rb')as fp:
return fp.read()
image_path ='預(yù)處理后的圖像路徑'# 注意替換為實(shí)際路徑
image = get_file_content(image_path)
# 調(diào)用OCR API進(jìn)行文字識(shí)別
options ={}
options["language_type"]="CHN_ENG"# 中英文識(shí)別
options["detect_direction"]="true"# 檢測(cè)圖像方向
options["detect_language"]="true"# 檢測(cè)語(yǔ)言
options["probability"]="true"# 返回識(shí)別概率
res = client.basicGeneral(image, options)
# 打印識(shí)別結(jié)果
if'words_result'in res:
for item in res['words_result']:
print(f"識(shí)別出的文字: {item['words']}, 置信度: {item['confidence']}")
else:
print("未識(shí)別到文字")
(注:此時(shí)代碼執(zhí)行后,將打印出OCR識(shí)別的結(jié)果,包括識(shí)別出的文字和對(duì)應(yīng)的置信度。同樣地,由于文本限制,無(wú)法直接展示識(shí)別結(jié)果,但讀者可以在本地運(yùn)行代碼并查看輸出結(jié)果。)
通過(guò)本項(xiàng)目的實(shí)現(xiàn),我們成功地將一張包含文字的文檔圖像轉(zhuǎn)換為可編輯的電子文本。以下是本項(xiàng)目的一些關(guān)鍵效果展示:
(注:由于文本限制,無(wú)法直接展示原始圖像。讀者可以想象或自行準(zhǔn)備一張文檔圖像。)
(注:同樣地,由于文本限制,無(wú)法直接展示預(yù)處理后的圖像。但讀者可以在本地運(yùn)行代碼并查看結(jié)果。)
(注:讀者可以在本地運(yùn)行代碼并查看識(shí)別結(jié)果。)
通過(guò)本項(xiàng)目的實(shí)踐,我們掌握了利用OpenCV進(jìn)行圖像預(yù)處理、結(jié)合百度OCR API進(jìn)行文字識(shí)別的關(guān)鍵技術(shù)。同時(shí),我們也深刻體會(huì)到了OCR技術(shù)在數(shù)字化辦公
本文章轉(zhuǎn)載微信公眾號(hào)@諱疾忌醫(yī)-note
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)