附代碼|OpenCV實現銀行卡號識別,字符識別算法你知多少?

2020-12-20 AI科技大本營

作者 | 李秋鍵

責編 | Carol

頭圖 | CSDN 付費下載自視覺中國

隨著計算機視覺在我們生活中的應用越來越廣泛,大量的字符識別和提取應用逐漸變得越來越受歡迎,同時也便利了我們的生活。像我們生活中的憑藉身份碼取快遞、超市掃碼支付的機器等等。字符識別是模式識別的一個重要應用,首先提取待識別字符的特徵;然後對提取出來的特徵跟字符模板的特徵匹配;最後根據準則判定該字符所屬的類別。不同的訓練方法,不同的特徵提取, 不同的匹配規則,就相應的有不同的字符識別方法,基本上很多就是在這些地方做改進,或者是採用新的規則。但是萬變不離其宗。1、模板匹配字符識別算法。模板匹配字符識別算法是圖像識別中的經典算法之一,該算法的核心思想是:通過比較待識別字符圖像的字符特徵和標準模板的字符特徵,計算兩者之間的相似性,相似性最大的標準模板的字符即為待識別的字符。2、神經網絡字符識別算法主要思想:通過神經網絡學習大量字符樣本,從而得到字符的樣本特徵。當對待識別的字符進行識別時,神經網絡就會將待識別字符的特徵和之前得到的樣本特徵匹配,從而識別出字符。3、支持向量機主要思想:同上,都是先得到樣本特徵,進行訓練,然後再分類。SVM應該算是用的最多的分類方法,一般大多適合於二分類問題,在這裡就需要使用多分類器來構造。

今天我們就簡單的利用OpenCV處理通過提取輪廓和匹配等方式來實現模式匹配的字符識別。

效果圖如下:

實驗前的準備

首先我們使用的python版本是3.6.5所用到的庫有cv2庫用來圖像處理;

Numpy庫用來矩陣運算,這裡主要用來對圖像像素值相關性處理;imutils庫可以輕鬆實現基本圖像處理功能,如平移,旋轉,調整大小,骨架化和顯示Matplotlib圖像。

程序的搭建

1、參考圖像的讀取和處理:

參考圖像如下,因為銀行卡號主要只有0~9這幾個數字,為了方便識別數字,我們直接利用這張圖片裡的數值作為匹配樣式:

所以下面我們要做的事很明顯,就是要將其中每個數字隔開方便後面匹配。

代碼如下:

#定義了一個字典 FIRST_NUMBER ,它將第一個數字映射到相應的信用卡類型。

FIRST_NUMBER = {

"3": "American Express",

"4": "Visa",

"5": "MasterCard",

"6": "Discover Card"

}

#參考數字圖像,用於匹配

#灰度化及二值化

ref=cv2.imread("1.png")

ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY)

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

#查找輪廓,從左往右排序

refCnts = cv2.findContours(ref.copy, cv2.RETR_EXTERNAL,

cv2.CHAIN_APPROX_SIMPLE)

refCnts = imutils.grab_contours(refCnts)

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

digits = {}

#對於其中每一個輪廓進行提循環,i為數字名稱,c為輪廓,我們將每個數字0-9(字典鍵)與第30行的每個roi 圖像(字典值)相關聯 。

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

#初始化幾個結構化內核,構造了兩個這樣的內核 - 一個矩形和一個正方形。我們將使用矩形的一個用於Top-hat形態運算符,將方形一個用於關閉操作。

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

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

2、獲取數字位置分組:

這裡需要識別的圖片為:

我們需要進行的處理包括二值化和Top-hat形態操作,最後通過findContours函數框出位置。

其中代碼如下:

#加載信用卡圖像

image=cv2.imread("3.jpg")

image=imutils.resize(image,width=300)

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

#執行Top-hat形態操作,將結果存儲為 tophat,Top-hat操作顯示了深色背景下的亮區(即信用卡號)

tophat=cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectKernel)

#計算沿x方向的漸變在計算gradX 數組中每個元素的絕對值之後 ,我們採取一些步驟將值縮放到範圍[0-255](因為圖像當前是浮點數據類型)。要做到這一點,我們計算 MINVAL

# 和 MAXVAL 的 gradX (線72),然後由我們的縮放方程上顯示 線73(即,最小/最大歸一化)。最後一步是將gradX轉換 為 uint8 ,其範圍為[0-255]

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")

#執行gradX 圖像的Otsu和二進位閾值,然後是另一個關閉操作,對數字分段

gradx=cv2.morphologyEx(gradx,cv2.MORPH_CLOSE,rectKernel)

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

thresh=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel)

#找到輪廓並初始化數字分組位置列表

cnts=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

cnts=imutils.grab_contours(cnts)

3、切割字符:

接著循環遍歷輪廓,同時根據每個的寬高比進行過濾,允許我們從信用卡的其他不相關區域修剪數字組位置,然後從左到右對分組進行排序,並初始化信用卡數字列表。

部分代碼如下:

locs =

#循環遍歷輪廓,同時根據每個的寬高比進行過濾,允許我們從信用卡的其他不相關區域修剪數字組位置

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

# compute the bounding box of the contour, then use the

# bounding box coordinates to derive the aspect ratio

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

ar = w / float(h)

# since credit cards used a fixed size fonts with 4 groups

# of 4 digits, we can prune potential contours based on the

# aspect ratio

if ar > 2.5 and ar < 4.0:

# contours can further be pruned on minimum/maximum width

# and height

if (w > 40 and w < 55) and (h > 10 and h < 20):

# append the bounding box region of the digits group

# to our locations list

locs.append((x, y, w, h))

#從左到右對分組進行排序,並初始化信用卡數字列表

locs = sorted(locs, key=lambda x:x[0])

output =

#遍歷四個排序的分組並確定其中的數字,循環的第一個塊中,我們在每一側提取並填充組5個像素(第125行)

# ,應用閾值處理(第126和127行),並查找和排序輪廓(第129-135行)。

for (i, (gX, gY, gW, gH)) in enumerate(locs):

# initialize the list of group digits

groupOutput =

# extract the group ROI of 4 digits from the grayscale image,

# then apply thresholding to segment the digits from the

# background of the credit card

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]

# detect the contours of each individual digit in the group,

# then sort the digit contours from left to right

digitCnts = cv2.findContours(group.copy, cv2.RETR_EXTERNAL,

cv2.CHAIN_APPROX_SIMPLE)

digitCnts = imutils.grab_contours(digitCnts)

digitCnts = contours.sort_contours(digitCnts,

method="left-to-right")[0]

# loop over the digit contours

for c in digitCnts:

# compute the bounding box of the individual digit, extract

# the digit, and resize it to have the same fixed size as

# the reference OCR-A images

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

roi = group[y:y + h, x:x + w]

roi = cv2.resize(roi, (57, 88))

# initialize a list of template matching scores

scores =

# loop over the reference digit name and digit ROI

for (digit, digitROI) in digits.items:

# apply correlation-based template matching, take the

# score, and update the scores list

result = cv2.matchTemplate(roi, digitROI,

cv2.TM_CCOEFF)

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

scores.append(score)

# the classification for the digit ROI will be the reference

# digit name with the *largest* template matching score

groupOutput.append(str(np.argmax(scores)))

# draw the digit classifications around the group

cv2.rectangle(image, (gX - 5, gY - 5),

(gX + gW + 5, gY + gH + 5), (0, 0, 255), 2)

cv2.putText(image, "".join(groupOutput), (gX, gY - 15),

cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)

# update the output digits list

output.extend(groupOutput)

# display the output credit card information to the screen

print("Credit Card Type: {}".format(FIRST_NUMBER[output[0]]))

print("Credit Card #: {}".format("".join(output)))

cv2.imshow("Image", image)

cv2.waitKey(0)

到這裡,我們整體的程序就搭建完成,下面為我們程序的運行結果:

源碼地址:

提取碼:k5ra

作者簡介:李秋鍵,CSDN博客專家,CSDN達人課作者。碩士在讀於中國礦業大學,開發有taptap競賽獲獎等等。

全球Python調查報告:Python 2正在消亡,PyCharm比VS Code更受歡迎來了來了!趨勢預測算法大PK!10行Python代碼能實現什麼高端操作?無代碼來了,還要程式設計師嗎?沒錯,你離分布式搜索只差一個Elasticsearch入門!再見,Eclipse | 原力計劃區塊鏈共識算法總結 | 原力計劃

相關焦點

  • python+opencv實現車牌識別
    文章目錄:一、前言二、訓練分類器2.1、準備訓練用單字符圖片2.2、圖片預處理2.3、用opencv的preprocess_hog()處理圖片2.4、用SVM訓練分類器三、車牌定位四、字符分割五、字符識別六、Mysql保存七、總結八、參考資料一、 前言:最近一直在學習機器學習,花了段時間把《機器學習實戰》(【美】Peter Harrington著
  • OpenCV手部關鍵點檢測(手勢識別)代碼示例
    Mask RCNN實例分割的博文(詳見:OpenCV4.0 Mask RCNN 實例分割示例 C++/Python實現),展示了OpenCV作為DNN推斷工具的簡單用法。昨日Satya Mallick又發表了使用OpenCV調用OpenPose工程中的手部關鍵點檢測(hand pose estimation)模型的文章,對於想要使用手部關鍵點檢測做手勢識別、手語識別、抽菸檢測等工程開發的朋友來說這是一個非常簡單的上手教程。先來看看作者發布的視頻效果:在大部分情況下還是不錯的,但也出現了少數幀關鍵點跳變的情況。
  • Python不超過10行代碼就可實現人臉識別,教你辨別真假
    這裡沒有用PIL,再結合特定算法,而是直接使用了OpenCV(http://opencv.org)。OpenCV是一個基於BSD許可發行的跨平臺計算機視覺庫,可以運行在Linux、Windows和Mac OS作業系統上,輕量而且高效,用C/C++編寫,同時提供了Python、Ruby、MATLAB等接口,實現了圖像處理和計算機視覺方面的很多通用算法。
  • 獨家 | 利用OpenCV和深度學習來實現人類活動識別(附連結)
    這篇教程會告訴你如何利用OpenCV和深度學習來實現人類動作識別。通過閱讀這篇教程,你可以學到如何利用OpenCV和深度學習來實現人類動作識別。我們實現的人類活動識別模型可以識別超過400類活動,其中準確率在78.4-94.5%之間(取決於任務類別)。
  • 關於銀行卡號的詳細規則
    我們在微信、支付寶等等應用上綁定銀行卡時,當我們輸入銀行卡號前6位的時候,就會發現,它們已經把我們的銀行卡是哪家銀行識別出來了,它們是怎麼識別的呢,今天我們就來看看銀行卡號的編碼規則。銀行卡號整體為13-19位,其中前6位為發卡標識代碼,最後1位為校驗碼,中間的為個人識別碼。
  • Python一行代碼,能玩這麼多童年的遊戲?
    安裝與使用安裝當然也很簡單一行代碼就可以pip install freegames由於該項目中的所有遊戲均是基於Python內置模塊Turtle製作,所以沒有太多依賴,安裝不會有困難。安裝完之後我們可以使用python -m freegames list來查看所有的遊戲列表貪吃蛇現在我們可以使用一行代碼啟動相關遊戲,比如貪吃蛇snakepython -m freegames.snake貪吃蛇的玩法想必不用過多解釋了,使用鍵盤即可操控吃豆人吃豆人沒玩過也應該聽過,使用下面的代碼可以啟動一個類似吃豆人的遊戲
  • 基於Tensorflow\keras銀行卡識別
    本文轉載自【微信公眾號:機器學習算法與Python精研 ,ID:AITop100】,經微信公眾號授權轉載,如需轉載原文作者聯繫來自:GitHub測試環境Ubuntu18.04python 3.6.7numpy 1.16.4tensorflow-gpu 1.13.1 或者是cpu版本keras 2.2.4opencv-python 4.1.0.25PyQt5 5.12.2CUDA
  • OpenCV對圖片做識別前的預處理
    識別前用OpenCV預處理圖片以減少背景噪音對文字的幹擾可以提高圖片文字的識別率和正確率。OpenCV的話題自己可以成一本書,這裡我們只是最淺層地使用它的功能函數。第三方模塊opencv-python幫助我們在python程序中應用openCV,老規矩:先安裝(opencv-python)後引進(import cv2)。
  • 計算機視覺:從入門到精通,極限剖析圖像識別學習算法
    本次課程將圍繞著計算機視覺中最常見的RCNN圖像識別算法進行極限剖析,從數學理論, 模型框架到實踐實操,讓你在短時間內從理論到實踐,掌握深度學習的基本知識和學習方法。· 目的:掌握神經網絡的基本原理,知其然亦知其所以然(從數學實踐到代碼的熟練和精通); · 手段:科學的方法。
  • 乾貨 | 人臉識別的簡要介紹(附實例、Python代碼)
    本文將介紹人臉識別的基本思路和對代碼進行簡要分析。介紹你是否意識到,每當你上傳照片到Facebook上,平臺都會用人臉識別算法來識別圖片中的人物?目前還有一些政府在用人臉識別技術來識別和抓捕罪犯。此外,最常見的應用就是通過自己的臉部解鎖手機。
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    我們的臉有幾個可以識別的特徵,比如眼睛、嘴巴、鼻子等等。當我們使用DLib算法檢測這些特徵時,我們實際上得到了每個特徵點的映射。該映射由67個點(稱為地標點)組成,可識別以下特徵:安裝要求與往常一樣,本文將用代碼演示示例,並將逐步指導你實現一個完整的人臉特徵識別示例。
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    李林 編譯自 pyimagesearch作者 Adrian Rosebrock量子位 報導 | 公眾號 QbitAIOpenCV是一個2000年發布的開源計算機視覺庫,有進行物體識別、圖像分割、人臉識別、動作識別等多種功能,可以在Linux、Windows、Android、Mac OS等作業系統上運行,以輕量級、高效著稱,且提供多種語言接口。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。 使用閾值處理和濾波技術來進行背景消除以獲得最佳結果。
  • OCR光學字符識別方法匯總(含原理與開源項目)
    光學字符識別(OCR)相信大家都不陌生,就是指電子設備(例如掃描儀或數位相機)檢查紙上列印的字符,通過檢測暗、亮的模式確定其形狀,然後用字符識別方法將形狀翻譯成計算機文字的過程。工業場景的圖像文字識別更加複雜,出現在很多不同的場合。
  • 介紹一個Python 包,幾行代碼可實現 OCR 文本識別!
    文字 OCR 識別技術現在已經相當成熟了,無論 其 準確度還是識別速度 都能夠滿足我們的日常需要;今天給大家介紹一個 Python 包,該包的主要功能就是用於 OCR 識別的,包的名字叫 Pyteeseract,藉助這個包幾行代碼就能快速識別一張文本圖片Pytesseract 包是由 開源工具
  • Android 端基於 OpenCV 的邊框識別功能
    本篇文章主要就邊框識別部分說一下開發過程及實現原理,通過閱讀本篇文章,你將具備以下技能:了解 NDK 開發的基本步驟,能使用 Java、C++/C 混合開發簡單的應用了解 OpenCV 庫的作用及其用法,能使用 OpenCV 做圖像處理了解基於 OpenCV 的邊框識別實現OpenCV 的全稱是 Open Source Computer Vision
  • 人臉識別經典算法實現
    最近研究了一下人臉識別,發現裡面很有門道啊,我是初入,還不是很理解,只能到時看看論壇,到處學習啊。感謝各位先人的帖子和代碼。
  • CVPR 2020文本圖像檢測與識別論文/代碼
    公眾號:datayxCVPR 2020 共收錄 1470篇文章,算法主要領域:圖像與視頻處理,圖像分類&檢測&分割、視覺目標跟蹤、視頻內容分析、人體姿態估計、模型加速、網絡架構搜索(NAS)、生成對抗(GAN)、光學字符識別(OCR)、人臉識別、三維重建等方向。
  • 如何構建識別圖像中字符的自動程序?一文解讀OCR與HTR
    選自Medium作者:Ajinkya Khalwadekar機器之心編譯參與:Panda、蛋醬在機器學習和計算機視覺領域,光學字符識別(OCR)和手寫文本識別(HTR)長期以來都是人們研究的重要主題。本文將幫助計算機視覺愛好者大致了解如何對文檔圖像中的文本進行識別。光學字符識別和手寫文本識別是人工智慧領域裡非常經典的問題。OCR 很簡單,就是將文檔照片或場景照片轉換為機器編碼的文本;而 HTR 就是對手寫文本進行同樣的操作。作者在文章中將這個問題分解成了一組更小型的問題,並製作了如下的流程圖。
  • 獨家 | 手把手教你運用深度學習構建視頻人臉識別模型(Python實現)
    其中一項技術就是人臉識別,它可以解決很多現實問題(如果被正確又合乎倫理地使用)。本文將展示如何使用開源工具完成一個人臉識別的算法。以下是的一個有趣的演示,這也為接下來的內容做好鋪墊: 你一定碰到過類似的例子,但並沒有意識到這些場景背後到底使用了什麼技術!例如,對於每一張上傳到平臺的圖像,Facebook都用自動生成的標籤建議替代手動給圖像加標籤。Facebook使用了一個簡單的人臉識別算法來分析圖像中人臉的像素,同時將它和相關用戶做比較。我們將學習如何創建一個人臉識別模型,但是在我們描述相關的技術細節之前,先來探討一些其它的應用案例。