主頁 > 知識(shí)庫 > Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法

Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法

熱門標(biāo)簽:鄭州智能外呼系統(tǒng)中心 云南地圖標(biāo)注 400電話 申請(qǐng) 條件 crm電銷機(jī)器人 汕頭電商外呼系統(tǒng)供應(yīng)商 北京外呼電銷機(jī)器人招商 南京crm外呼系統(tǒng)排名 賓館能在百度地圖標(biāo)注嗎 電銷機(jī)器人 金倫通信

學(xué)在前面

從本篇博客起,我們將實(shí)際完成幾個(gè)小案例,第一個(gè)就是銀行卡號(hào)識(shí)別,預(yù)計(jì)本案例將寫 5 篇左右的博客才可以完成,一起加油吧。

本文的目標(biāo)是最終獲取一套招商銀行卡,0~9 數(shù)字的圖,對(duì)于下圖的數(shù)字,我們需要提取出來,便于后續(xù)模板匹配使用。不過下圖中找到的數(shù)字不完整,需要找到盡量多的卡片,然后補(bǔ)齊這些數(shù)字。

提取卡片相關(guān)數(shù)字

先對(duì)上文中卡片中的數(shù)字進(jìn)行相關(guān)提取操作,加載圖片的灰度圖,獲取目標(biāo)區(qū)域。在畫板中模擬一下坐標(biāo)區(qū)域,為了便于進(jìn)行后續(xù)的操作。


具體代碼如下:

import cv2 as cv
import numpy as np
# 讀取灰度圖
src = cv.imread("./ka1.jpg", 0)

# 尋找卡號(hào)目標(biāo)區(qū)域
roi = src[142:168, 42:360]
# cv.imshow("roi",roi)

獲取到的圖片如下,發(fā)現(xiàn)右側(cè)邊緣缺少一部分內(nèi)容,對(duì)目標(biāo)區(qū)域坐標(biāo)進(jìn)行微調(diào)。

修改之后的代碼如下,你如果使用的圖片與橡皮擦不一致,注意進(jìn)行修改。

# 尋找卡號(hào)目標(biāo)區(qū)域
roi = src[142:168, 46:364]
cv.imshow("roi",roi)

消除噪音,可以增加模糊卷積操作,分別測(cè)試均值模糊,中值模糊,高斯模糊效果。

# 模糊卷積操作
blur_roi = cv.blur(roi,(5,5))
cv.imshow("blur_roi",blur_roi)

med_roi = cv.medianBlur(roi,5)
cv.imshow("med_roi",med_roi)

gau_roi = cv.GaussianBlur(roi,(7,7),0)
cv.imshow("gau_roi",gau_roi)

測(cè)試不同的卷積核效果,選擇一個(gè)合適的即可,我這里發(fā)現(xiàn)卷積核為 (7,7) 的時(shí)候,高斯模糊效果不錯(cuò),可以去噪。


接下來進(jìn)行二值化操作。

# 對(duì)目標(biāo)區(qū)域進(jìn)行二值化操作
ret, thresh = cv.threshold(
  gau_roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("thresh", thresh)

二值化處理完畢之后,發(fā)現(xiàn)還存在一些白色區(qū)域的點(diǎn),需要去除掉,這里使用了形態(tài)學(xué)里面的腐蝕操作。

# 腐蝕
kernel = np.ones((3, 4), np.uint8)
dst = cv.erode(thresh, kernel=kernel)

腐蝕之后在進(jìn)行膨脹,讓原有的數(shù)字區(qū)域變的明顯,最后的圖片是進(jìn)行之后的效果,關(guān)于卷積核你可以自行調(diào)整。

# 腐蝕
kernel = np.ones((3, 4), np.uint8)
erode_dst = cv.erode(thresh, kernel=kernel)
cv.imshow("erode_dst", erode_dst)
# 膨脹
kernel = np.ones((4, 4), np.uint8)
dilate_dst = cv.dilate(erode_dst, kernel=kernel)

下面進(jìn)行外輪廓檢測(cè),檢測(cè)之后發(fā)現(xiàn)恰好有 16 個(gè)輪廓,也就對(duì)應(yīng)了 16 個(gè)數(shù)字區(qū)域。

# 檢測(cè)外輪廓
# 只檢測(cè)外輪廓
contours, hierarchy = cv.findContours(dilate_dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

print(len(contours))

對(duì)輪廓面積進(jìn)行一下輸出,為了防止出現(xiàn)非目標(biāo)區(qū)域,可以進(jìn)行一下基本的判斷,當(dāng)羅闊面積大于 80 的時(shí)候才進(jìn)行展示。

target_list = []
# 輪廓判斷
for cnt in contours:

  # 輪廓面積
  area = cv.contourArea(cnt)
  print(area)
  if area > 79:
    target_list.append(cnt)

print(len(target_list))

有這些參數(shù)之后,就可以對(duì)灰度圖進(jìn)行裁切了,基于外接矩形獲取目標(biāo)區(qū)域,我直接做了循環(huán)展示。

for index, cnt in enumerate(target_list):
  # 外接矩形
  x, y, w, h = cv.boundingRect(cnt)
  # 在二值化的圖像上進(jìn)行目標(biāo)區(qū)域獲取
  c_roi = roi[y:y+h, x:x+w]
  # 調(diào)整圖像大小
  # big_roi = cv.resize(c_roi, dsize=(0, 0), fx=2, fy=2)
  # big_roi = cv.resize(c_roi, dsize=(0, 0))
  cv.imshow("big_roi"+str(index), c_roi)
  # cv.imwrite(f"./numbers/ka_{index}.png", big_roi)

接下來放大圖片對(duì)其進(jìn)行保存即可,得到如下圖片列表,至此,已經(jīng)獲取到 1、4、6、8 幾個(gè)數(shù)字,下面在切換到另一張卡片,去獲取其他數(shù)字即可,注意圖片大小保持一致。

big_roi = cv.resize(c_roi, dsize=(42, 66))
# cv.imshow("c_roi"+str(index), c_roi)
cv.imwrite(f"./numbers/ka1_{index}.png", big_roi)

新的圖像注意調(diào)整目標(biāo)區(qū)域,獲取素材,已經(jīng)獲取到 1、2、4、5、6、7、8 幾個(gè)數(shù)字


反復(fù)迭代這個(gè)辦法,知道 0~9 個(gè)數(shù)字獲取完整,找到所有數(shù)字之后,對(duì)該文件夾中的所有文件進(jìn)行二值化操作。

import cv2 as cv
import os

def walk_file(file):
  for root, dirs, files in os.walk(file):
    for f in files:
      file = os.path.join(root, f)
      # 讀取灰度圖
      basename = os.path.basename(file)
      filename = basename.split(".")[0]
      src = cv.imread(file, 0)
      ret, thresh = cv.threshold(src, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
      # cv.imshow("thresh", thresh)
      cv.imwrite(f"./numbers/001_{filename}_bit.png", thresh)
      cv.waitKey()
      cv.destroyAllWindows()

if __name__ == "__main__":
  walk_file("./numbers")

二值化之后,挑選出比較清晰的數(shù)字即可,如果發(fā)現(xiàn)存在不清楚的,可以在尋找資源進(jìn)行提取,銀行里面 8 真的是太多了。

橡皮擦最后調(diào)整之后,得到的結(jié)果如下所示,信用卡卡號(hào)識(shí)別的第一步算是準(zhǔn)備好了。

到此這篇關(guān)于Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法的文章就介紹到這了,更多相關(guān)OpenCV信用卡卡號(hào)識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解Python OpenCV數(shù)字識(shí)別案例
  • python opencv人臉識(shí)別考勤系統(tǒng)的完整源碼
  • Python基于Opencv識(shí)別兩張相似圖片
  • python基于OpenCV模板匹配識(shí)別圖片中的數(shù)字
  • Python+Opencv實(shí)現(xiàn)數(shù)字識(shí)別的示例代碼
  • Opencv+Python識(shí)別PCB板圖片的步驟
  • python基于opencv實(shí)現(xiàn)人臉識(shí)別
  • python+opencv實(shí)現(xiàn)文字顏色識(shí)別與標(biāo)定功能

標(biāo)簽:浙江 錫林郭勒盟 懷化 梅州 文山 西寧 昆明 石家莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法》,本文關(guān)鍵詞  Python,OpenCV,招商,銀行,信用卡,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章