生活随笔
收集整理的這篇文章主要介紹了
OpenCV-信用卡数字识别-03
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
模板圖
銀行卡圖
from imutils
import contours
import numpy
as np
import argparse
import cv2
FIRST_NUMBER
= {"3": "American Express","4": "Visa","5": "MasterCard","6": "Discover Card"
}
def cv_show(name
, img
):cv2
.imshow
(name
, img
)cv2
.waitKey
(0)
img
= cv2
.imread
("ocr_a_reference.png")
cv_show
('template',img
)
ref
= cv2
.cvtColor
(img
, cv2
.COLOR_BGR2GRAY
)
cv_show
('template_gray',ref
)
ref
= cv2
.threshold
(ref
, 10, 255, cv2
.THRESH_BINARY_INV
)[1]
cv_show
('template_bi',ref
)
ref_
,refCnts
, hierarchy
= cv2
.findContours
(ref
.copy
(), cv2
.RETR_EXTERNAL
,cv2
.CHAIN_APPROX_SIMPLE
)cv2
.drawContours
(img
,refCnts
,-1,(0,0,255),3)
cv_show
('template_Contours',img
)
print (np
.array
(refCnts
).shape
)
def sort_contours(cnts
, method
="left-to-right"):reverse
= Falsei
= 0if method
== "right-to-left" or method
== "bottom-to-top":reverse
= Trueif method
== "top-to-bottom" or method
== "bottom-to-top":i
= 1boundingBoxes
= [cv2
.boundingRect
(c
) for c
in cnts
] (cnts
, boundingBoxes
) = zip(*sorted(zip(cnts
, boundingBoxes
),key
=lambda b
: b
[1][i
], reverse
=reverse
))return cnts
, boundingBoxes
def resize(image
, width
=None, height
=None, inter
=cv2
.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
= cv2
.resize
(image
, dim
, interpolation
=inter
)return resized
refCnts
= sort_contours
(refCnts
, method
="template_Contours")[0]
digits
= {}
for (i
, c
) in enumerate(refCnts
):
(x
, y
, w
, h
) = cv2
.boundingRect
(c
)roi
= ref
[y
:y
+ h
, x
:x
+ w
] roi
= cv2
.resize
(roi
, (57, 88)) digits
[i
] = roi
rectKernel
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
, (9, 3))
sqKernel
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
, (5, 5))
image
= cv2
.imread
("credit_card_01.png")
cv_show
('Input_img',image
)
image
= resize
(image
, width
=300)
gray
= cv2
.cvtColor
(image
, cv2
.COLOR_BGR2GRAY
)
cv_show
('Input_gray',gray
)
tophat
= cv2
.morphologyEx
(gray
, cv2
.MORPH_TOPHAT
, rectKernel
)
cv_show
('Input_tophat',tophat
)
gradX
= cv2
.Sobel
(tophat
, ddepth
=cv2
.CV_32F
, dx
=1, dy
=0, ksize
=-1)gradX
= np
.absolute
(gradX
)
(minVal
, maxVal
) = (np
.min(gradX
), np
.max(gradX
))
gradX
= (255 * ((gradX
- minVal
) / (maxVal
- minVal
)))
gradX
= gradX
.astype
("uint8")print (np
.array
(gradX
).shape
)
cv_show
('Input_Sobel_gradX',gradX
)
gradX
= cv2
.morphologyEx
(gradX
, cv2
.MORPH_CLOSE
, rectKernel
)
cv_show
('Input_CLOSE_gradX',gradX
)
thresh
= cv2
.threshold
(gradX
, 0, 255, cv2
.THRESH_BINARY
| cv2
.THRESH_OTSU
)[1]
cv_show
('Input_thresh',thresh
)
thresh
= cv2
.morphologyEx
(thresh
, cv2
.MORPH_CLOSE
, sqKernel
)
cv_show
('Input_thresh_CLOSE',thresh
)
thre_
,threshCnts
, hierarchy
= cv2
.findContours
(thresh
.copy
(), cv2
.RETR_EXTERNAL
,cv2
.CHAIN_APPROX_SIMPLE
)cnts
= threshCnts
cur_img
= image
.copy
()
cv2
.drawContours
(cur_img
,cnts
,-1,(0,0,255),3)
cv_show
('Input_Contours',cur_img
)
locs
= []
for (i
, c
) in enumerate(cnts
):
(x
, y
, w
, h
) = cv2
.boundingRect
(c
)ar
= w
/ float(h
)
if ar
> 2.5 and ar
< 4.0:if (w
> 40 and w
< 55) and (h
> 10 and h
< 20):
locs
.append
((x
, y
, w
, h
))
locs
= sorted(locs
, key
=lambda x
:x
[0])
output
= []
for (i
, (gX
, gY
, gW
, gH
)) in enumerate(locs
):
groupOutput
= []
group
= gray
[gY
- 5:gY
+ gH
+ 5, gX
- 5:gX
+ gW
+ 5]
group
= cv2
.threshold
(group
,0,255,cv2
.THRESH_BINARY
| cv2
.THRESH_OTSU
)[1]group_name
= 'Input_group_' + str(i
)cv_show
(group_name
,group
)cv2
.imwrite
('./credit_card_01/' + group_name
+ '.jpg',group
)
dig_
,digitCnts
,hierarchy
= cv2
.findContours
(group
.copy
(), cv2
.RETR_EXTERNAL
,cv2
.CHAIN_APPROX_SIMPLE
)
digitCnts
= contours
.sort_contours
(digitCnts
,method
="left-to-right")[0]for c
in digitCnts
: z
=0
(x
, y
, w
, h
) = cv2
.boundingRect
(c
) roi
= group
[y
:y
+ h
, x
:x
+ w
] roi
= cv2
.resize
(roi
, (57, 88))roi_name
= 'roi_'+str(z
)scores
= []
for (digit
, digitROI
) in digits
.items
():result
= cv2
.matchTemplate
(roi
, digitROI
,cv2
.TM_CCOEFF
) (_
, score
, _
, _
) = cv2
.minMaxLoc
(result
) scores
.append
(score
) groupOutput
.append
(str(np
.argmax
(scores
))) z
= z
+1cv2
.rectangle
(image
, (gX
- 5, gY
- 5),(gX
+ gW
+ 5, gY
+ gH
+ 5), (0, 0, 255), 1)cv2
.putText
(image
, " ".join
(groupOutput
), (gX
, gY
- 15),cv2
.FONT_HERSHEY_SIMPLEX
, 0.65, (0, 0, 255), 2)output
.extend
(groupOutput
)
print("Credit Card Type: {}".format(FIRST_NUMBER
[output
[0]]))
print("Credit Card #: {}".format("".join
(output
)))
cv2
.imshow
("Output_image", image
)
cv2
.waitKey
(0)
總結
以上是生活随笔為你收集整理的OpenCV-信用卡数字识别-03的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。