一、主要**
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,不管那個欄位被更新,執行更新是相同的。但是這...