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