02 文件掃瞄OCR識別

2021-10-12 00:22:11 字數 4322 閱讀 3109

一、主要**

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

defimg_show

(img_name,img)

: cv.imshow(img_name,img)

cv.waitkey(0)

cv.destroyallwindows(

)#1、資料預處理

#2、轉為灰度圖

gray = cv.cvtcolor(img,cv.color_bgr2gray)

#3、高斯平滑:去噪

gauss = cv.gaussianblur(gray,(5

,5),

0)#4、canny運算元:邊緣檢測

edge = cv.canny(gauss,75,

200)

#5、輪廓檢測 計算出所有的輪廓

cnts = cv.findcontours(edge.copy()[

0]#6、對所有輪廓進行排序 找到面積最大的5個輪廓

cnts =

sorted

(cnts,key=cv.contourarea,reverse=

true)[

:5]#7、遍歷這五個輪廓 找到最外面的大輪廓

for c in cnts:

peri = cv.arclength(c,

true

)#計算輪廓的周長

0.02

*peri,

true

)#計算輪廓近似

iflen==4

:#找到最外邊的矩形大輪廓

break

# 8、透視變換 把影象擺正

wraped=four_point_transform(orig,screencnt.reshape(4,

2)*ratio)

# 9、二值處理 得到掃瞄到的檔案

gray = cv.cvtcolor(wraped,cv.color_bgr2gray)

ref = cv.threshold(gray,

100,

255,cv.thresh_binary)[1

]ref=cv.resize(ref,

none

,fx=

0.3,fy=

0.3)

#10、用ocr識別檔案上的字元

二、結果展示

三、工具**

def

resize

(image, width=

none

, height=

none

, inter=cv.inter_area)

: dim =

none

(h, w)

= image.shape[:2

]if width is

none

and height is

none

:return image

if width is

none

: r = height /

float

(h) dim =

(int

(w * r)

, height)

else

: r = width /

float

(w) dim =

(width,

int(h * r)

) resized = cv.resize(image, dim, interpolation=inter)

return resized

deforder_points

(pts)

:# 一共4個座標點

rect = np.zeros((4

,2), dtype =

"float32"

)# 按順序找到對應座標0123分別是 左上,右上,右下,左下

# 計算左上,右下

s = pts.

sum(axis =1)

rect[0]

= pts[np.argmin(s)

] rect[2]

= pts[np.argmax(s)

]# 計算右上和左下

diff = np.diff(pts, 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)

(tl, tr, br, bl)

= rect

# 計算輸入的w和h值

widtha = np.sqrt(

((br[0]

- bl[0]

)**2)

+((br[1]

- bl[1]

)**2)

) widthb = np.sqrt(

((tr[0]

- tl[0]

)**2)

+((tr[1]

- tl[1]

)**2)

) maxwidth =

max(

int(widtha)

,int

(widthb)

) heighta = np.sqrt(

((tr[0]

- br[0]

)**2)

+((tr[1]

- br[1]

)**2)

) heightb = np.sqrt(

((tl[0]

- bl[0]

)**2)

+((tl[1]

- bl[1]

)**2)

) maxheight =

max(

int(heighta)

,int

(heightb)

)# 變換後對應座標位置(-1只是為了防止有誤差出現,不-1也可以。)

dst = np.array([[

0,0]

,[maxwidth -1,

0],[maxwidth -

1, maxheight -1]

,[0, maxheight -1]

], dtype =

"float32"

)# 計算變換矩陣

m = cv.getperspectivetransform(rect, dst)

warped = cv.warpperspective(image, m,

(maxwidth, maxheight)

)# 返回變換後結果

return warped

文件掃瞄OCR識別

1 邊緣檢測cv2.canny 函式 1 cv2.canny 函式原型 edge cv2.canny image,threshold1,threshold2 edges aperturesize l2gradient image 原影象 threshold1,2 是閾值,兩個閾值相互作用 大部分情況...

OCR應用(證件識別 文件識別)

1 ocr識別 證件識別 高效 識別率高達99.7 單張識別速度小於1秒,領先業內 方便 該識別服務更新維護方便,企業可自行進行更新維護 全面 可識別身份證 護照 行駛證 駕駛證等30多種證件 1 希望將紙質書籍或紙質資料中的文字資訊,進行ocr識別轉換成可編輯的電子版檔案 2 希望將各類證件 如身...

7 1文件更新

7.1.1通過替換修改 通過查詢獲取整個文件doc,設定doc的email屬性後,通過update更新整個文件。替換是更通用的做法。想象一下通過引用html表單來更新使用者user資料。使用文件替換時,資料從表單提交,一旦驗證,就可以傳遞給mongodb,不管那個欄位被更新,執行更新是相同的。但是這...