openCV銀行卡數(shù)字匹配(重點(diǎn)歸納)

(1)引入模塊

import cv2

import numpy as np

import myutils

(2)圖像的基本操作

1.圖像讀取

img=cv2.imread("路徑")

2.圖像顯示

cv2.imshow("窗口名",圖像變量(img))

(3)圖像的輪廓檢測(cè)

1.圖像的灰度化

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

或直接img=cv2,imread("路徑",0)

2.圖像的二值化(黑白圖像)

ref=cv2.threshold(gray,10,255,cv2.THRESH_BINARY_INV)[1]

10,255:表示閾值(超過10取255,小于取0)

cv2.THRESH_BINARY_INV表示取法相反

3.尋找輪廓

refCnt,hierarchy=cv2.findContours(ref,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

ref表示在輪廓檢測(cè)中要用二值圖像

cv2.RETR_EXTERNAL只尋外輪廓

draw_refCnt=cv2.drawContours(img.copy(),refCnt,-1,(0,0,255),3)

img.copy()為在畫輪廓時(shí)不印象原圖

reCnts表示輪廓

-1表示所有的輪廓

3表示通道3

結(jié)果:

4.模塊輪廓?jiǎng)澐趾团判?/p>

1.refCnts = myutils.sort_contours(refCnts, method="left-to-right")[0]

將數(shù)字模板每個(gè)數(shù)字的輪廓計(jì)算出來肺然,并且排序艺蝴,reCnts可以看做輪廓合集

2.遍歷每個(gè)輪廓,得到模塊

for (i,c) in enumerate (reCnts)://遍歷每個(gè)輪廓

enumerate() 函數(shù)用于將一個(gè)可遍歷的數(shù)據(jù)對(duì)象(如列表杂穷、元組或字符串)組合為一個(gè)索引序列悍缠,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),一般用在 for 循環(huán)當(dāng)中耐量。

(x,y,w,h)=cv2.boundingrect(c)//獲得輪廓的外接矩形飞蚓,返回元組矩形左上坐標(biāo)和矩陣長寬

roi=ref[x:x+w,????y:y+h]//獲得roi感興趣部分

roi=cv2.resize(58,88)//轉(zhuǎn)化大小適用于模板匹配


4.定義卷積核

rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))

sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))


5.讀入銀行卡圖像,預(yù)處理(使其可以更準(zhǔn)確)

1.img2=cv2.imread("絕對(duì)路徑")

img2=myutils.resize(img2,width=300)//把寬變?yōu)?00,其高轉(zhuǎn)變?yōu)閷?duì)應(yīng)的長度

gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)//灰度化

tophat=cv2.morphologyEx(gray,MORPH_TOPHAT,rectKernel)//禮帽處理廊蜒,使圖像變得更加明亮


6.sobel算子

gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0,? ksize=-1)# ksize=-1相當(dāng)于用3*3的

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('gradX', gradX)

sobel算子作用:Sobel算子根據(jù)像素點(diǎn)上下趴拧、左右鄰點(diǎn)灰度加權(quán)差溅漾,在邊緣處達(dá)到極值這一現(xiàn)象檢測(cè)邊緣。對(duì)噪聲具有平滑作用著榴,提供較為精確的邊緣方向信息添履,邊緣定位精度不夠高。當(dāng)對(duì)精度要求不是很高時(shí)兄渺,是一種較為常用的邊緣檢測(cè)方法缝龄。

7.進(jìn)行閉運(yùn)算【先腐后膨】(對(duì)輸入圖像沒有規(guī)定(灰度圖和二值圖像))

gradx=cv2.morphologyEX(gradX,0,255,cv2.MORPH_CLOSE,rectKernel)

作用:使圖像中的孔隙填充(先對(duì)圖像膨脹后腐蝕 作用:用來填充物體內(nèi)的小空洞,連接鄰近的物體,連接斷開的輪廓線,平滑其邊界的同時(shí)不改變面積)

8.二值化cv2.threshold

# THRESH_OTSU會(huì)自動(dòng)尋找合適的閾值,適合雙峰挂谍,需把閾值參數(shù)設(shè)置為0

thresh = cv2.threshold(gradX, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

9.在進(jìn)行一個(gè)閉運(yùn)算

thresh=cv2.morphologyEX(thresh,0,255,cv2.MORPH_CLOSE,rectKernel)

10.尋找輪廓

threshcnts,hierarchy=cv2.foundContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

cnts=theshcnts

11.遍歷輪廓數(shù)字組

locs=[]

for(i,c) in enumerate(cnts):

????(x,y,w,h)=cv2.boundingRect(c)

? ? ar=w/float(h)

? ??# 選擇合適的區(qū)域叔壤,根據(jù)實(shí)際任務(wù)來,這里的基本都是四個(gè)數(shù)字一組

? ??if ar >2.5 and ar <4.0://根據(jù)實(shí)際大小比例

????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 = []

12.遍歷數(shù)字輪廓(每個(gè)數(shù)字組中數(shù)字)

for(i,(gx,gy,gw,gh)) in enumberate(locs):

? ? groudOutput=[]//定義一個(gè)list

? ??# 根據(jù)坐標(biāo)提取每一個(gè)組

????group = gray[gY -5:gY + gH +5, gX -5:gX + gW +5]//截取灰度圖像

????cv_show('group', group)

????# 預(yù)處理

????group = cv2.threshold(group, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

????cv_show('group', group)

????# 計(jì)算每一組的輪廓

????digitCnts, hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL炼绘,

?????cv2.CHAIN_APPROX_SIMPLE)//輪廓檢測(cè)

????digitCnts = myutils.sort_contours(digitCnts,method="left-to-right")[0]? ? //為數(shù)字組中每個(gè)數(shù)字輪廓排序

? ? for (c) in (digitCnts):

? ? ? ? (x,y,w,h)=cv2.boundingRect(c)

? ? ? ? roi=(y:y+h,x:x+w)

? ? ? ? roi=cv2.resize(roi,(58,88))

? ? ? ? #?計(jì)算匹配得分

????????scores = []

? ??????# 在模板中計(jì)算每一個(gè)得分

????????for (digit, digitROI)in digits.items()://item()方法把字典中每對(duì)key和value組成一個(gè)元組妄田,并把這些元組放在列表中返回俺亮。digit為key,digitROI為value

? ? ? ? ?# 模板匹配

? ? ????????result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF_NORMED))#TM_CCOEFF_NORMED疟呐,1表示完美的匹配脚曾;-1表示最差的匹配。即表示越大越好

????????????(_, score, _, _) = cv2.minMaxLoc(result)????

????????????scores.append(score)//#result參數(shù)表示匹配結(jié)果圖像启具,必須是單通道32位浮點(diǎn),scorce參數(shù)表示返回的最大值//score可以大致認(rèn)為匹配度本讥,匹配度越大,越準(zhǔn)確

????????????# 得到最合適的數(shù)字

????????????groupOutput.append(str(np.argmax(scores)))//#numpy.argmax(array, axis) 用于返回一個(gè)numpy數(shù)組中最大值(最大可能性)的索引值(下標(biāo))

? ??????????# 畫出來

????????????cv2.rectangle(img2, (gX -5, gY -5),(gX + gW +5, gY + gH +5), (0, 0, 255), 1)

????????????cv2.putText(img2, "".join(groupOutput), (gX, gY -15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)

cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)

各參數(shù)依次是:圖片鲁冯,添加的文字拷沸,左上角坐標(biāo),字體薯演,字體大小撞芍,顏色,字體粗細(xì)

Python join() 方法用于將序列中的元素以指定的字符連接生成一個(gè)新的字符串

print("Credit Card #: {}".format("".join(output)))//數(shù)字識(shí)別結(jié)果

cv2.imshow("Image", img2)

cv2.waitKey(0)

附言:這個(gè)小項(xiàng)目網(wǎng)上已經(jīng)有許多源代碼(本文只是代碼簡單說明)跨扮,本博客只是自己對(duì)這個(gè)項(xiàng)目的理解序无,希望對(duì)讀者有點(diǎn)幫助

銀行卡圖片:

模板圖片:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市好港,隨后出現(xiàn)的幾起案子愉镰,更是在濱河造成了極大的恐慌,老刑警劉巖钧汹,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丈探,死亡現(xiàn)場離奇詭異,居然都是意外死亡拔莱,警方通過查閱死者的電腦和手機(jī)碗降,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門隘竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讼渊,你說我怎么就攤上這事动看。” “怎么了爪幻?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵菱皆,是天一觀的道長。 經(jīng)常有香客問我挨稿,道長仇轻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任奶甘,我火速辦了婚禮篷店,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臭家。我一直安慰自己疲陕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布钉赁。 她就那樣靜靜地躺著蹄殃,像睡著了一般汇跨。 火紅的嫁衣襯著肌膚如雪沉御。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天奕污,我揣著相機(jī)與錄音姓蜂,去河邊找鬼。 笑死医吊,一個(gè)胖子當(dāng)著我的面吹牛钱慢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卿堂,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼束莫,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了草描?” 一聲冷哼從身側(cè)響起览绿,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穗慕,沒想到半個(gè)月后饿敲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逛绵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年怀各,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倔韭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓢对,死狀恐怖寿酌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硕蛹,我是刑警寧澤醇疼,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站法焰,受9級(jí)特大地震影響秧荆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壶栋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一辰如、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贵试,春花似錦琉兜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桑滩,卻和暖如春梧疲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背运准。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工幌氮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胁澳。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓该互,卻偏偏與公主長得像,于是被迫代替她去往敵國和親韭畸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宇智,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容