銀行卡號識別案例

代碼實現:

import cv2
import numpy as np
import argparse
import myutils
'''
-i moban.png
-t card1.png
'''
ap= argparse.ArgumentParser()
ap.add_argument("-i","--image", required=True,help="path to input image")
ap.add_argument("-t","--template", required=True,help="path to template 0cR-A image")
args = vars(ap.parse_args())
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(args["template"])
cv_show('img',img)
ref =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv_show('ref',ref)
ref = cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]
cv_show('ref',ref)
_,refCnts, hierarchy = cv2.findContours(ref, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,refCnts,-1,(0,0,255),3)
cv_show('img',img)
refCnts = myutils.sort_contours(refCnts,method="left-to-right")[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))cv_show('ro',roi)digits[i]= roi
print(digits)
''' --------信用卡的圖像處理----------- '''
image = cv2.imread(args['image'])
cv_show('image',image)
image = myutils.resize(image,width=300)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv_show('gray',gray)
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,3))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
tophat = cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectKernel)
cv_show('tophat',tophat)
closeX = cv2.morphologyEx(tophat,cv2.MORPH_CLOSE,rectKernel)
cv_show('gradX',closeX)
thresh = cv2.threshold(closeX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
cv_show('thresh',thresh)
thresh = cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel)
cv_show('thresh1',thresh)
_,threshCnts,h = 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('img',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])
print(locs)
output = []
# 遍歷每一個輪廓中的數字
for (i, (gX, gY, gW, gH)) in enumerate(locs):groupOutput = []group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]  # 適當加一點邊界cv_show('group', group)# 預處理group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]cv_show('group', group)# 計算每一組的輪廓group_, digitCnts, hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)digitCnts = myutils.sort_contours(digitCnts, method="left-to-right")[0]# 計算每一組中的每一個數值for c in digitCnts:# 找到當前數值的輪廓,resize成合適的大小(x, y, w,h) = cv2.boundingRect(c)roi = group[y:y + h, x:x + w]roi = cv2.resize(roi, (57, 88))cv_show('roi', roi)'''--------使用模板匹配,計算匹配得分-----------'''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)))# 畫出來cv2.rectangle(image, (gX - 5, gY - 5), (gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)# cv2.putText()是OpenCV庫中的一個函數,用于在圖像上添加文本。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("Image", image)
cv2.waitKey(0)

這段代碼實現了基于模板匹配的信用卡數字識別,核心流程分為「模板圖像預處理」「信用卡圖像預處理」「輪廓檢測與分組」「數字模板匹配與識別」四個階段,以下是詳細解析:

1. 初始化與參數解析

  • 參數解析:通過?argparse?解析命令行參數,-i?指定信用卡輸入圖像路徑,-t?指定數字模板圖像(包含 0-9 數字的參考圖)。
  • 信用卡品牌映射FIRST_NUMBER?字典通過卡號首數字映射信用卡品牌(如 Visa 以 4 開頭)。
  • 輔助函數cv_show?用于調試時顯示圖像并等待按鍵。

2. 模板圖像預處理(制備數字模板)

目的是從模板圖像中提取?0-9 的標準數字模板,供后續匹配使用:

  1. 讀入與灰度轉換:讀取模板圖像并轉為灰度圖。
  2. 反相二值化cv2.threshold(..., THRESH_BINARY_INV)?將數字轉為白色、背景轉為黑色,便于輪廓檢測。
  3. 輪廓檢測與排序
    • cv2.findContours?提取所有外部輪廓(每個數字對應一個輪廓)。
    • myutils.sort_contours(自定義函數)按從左到右排序輪廓,確保數字順序與視覺一致。
  4. 提取數字 ROI 并標準化:遍歷每個輪廓,提取數字區域(ROI),并縮放到統一尺寸?(57, 88),存儲到?digits?字典(鍵為索引,值為數字模板)。

3. 信用卡圖像預處理(增強數字區域)

目的是從信用卡圖像中突出數字區域,便于后續輪廓檢測:

  1. 讀入與尺寸調整:讀取信用卡圖像,按比例縮放到寬度 300(方便統一處理)。
  2. 灰度轉換:轉為灰度圖,消除顏色干擾。
  3. 形態學操作(增強數字)
    • 頂帽操作(TOPHAT):用長方形結構核?rectKernel?突出比背景亮的區域(即數字區域)。
    • 閉運算(CLOSE):先膨脹后腐蝕,用?rectKernel?連接水平方向的數字,使 “4 位一組的數字” 形成整體區域;再用正方形核?sqKernel?連接數字內部間隙,讓輪廓更完整。
  4. 二值化(OTSU 自適應閾值)cv2.threshold(..., THRESH_BINARY | THRESH_OTSU)?自動確定閾值,將圖像轉為黑白二值圖(數字為白,背景為黑)。

4. 輪廓篩選與數字分組

目的是從預處理后的圖像中,篩選出 ** 信用卡數字組(通常 4 位一組)** 的輪廓:

  • 遍歷所有輪廓,通過寬高比(ar寬 / 高的數值范圍篩選符合 “數字組特征” 的輪廓(如信用卡數字組寬高比約 2.5-4,寬度 40-55,高度 10-20,需根據實際圖像調整)。
  • 按輪廓的?x 坐標排序,確保從左到右處理數字組。

5. 數字模板匹配與識別

對每個篩選出的數字組,逐數字進行模板匹配:

  1. 提取數字組 ROI:擴展數字組的邊界(gY -5?等),避免數字被截斷。
  2. 數字組二值化:對提取的區域再次二值化,與模板格式一致。
  3. 單數字輪廓檢測與排序:提取數字組內的單個數字輪廓,按從左到右排序。
  4. 模板匹配
    • 對每個單數字 ROI,縮放到模板尺寸?(57, 88)
    • 用?cv2.matchTemplate(方法為?TM_CCOEFF)與?digits?中所有數字模板匹配,計算 “匹配得分”。
    • 選擇得分最高的模板,其索引對應數字(如索引 0 對應模板中最左側數字)。
  5. 結果繪制與存儲:在原圖上繪制數字組的矩形框,并將識別出的數字用?cv2.putText?顯示;同時將數字存入?output?列表,最終拼接為完整卡號。

6. 信用卡品牌與卡號輸出

  • 從?output?中取首數字,通過?FIRST_NUMBER?字典判斷信用卡品牌。
  • 打印品牌與完整卡號,并顯示最終圖像。

關鍵注意事項

  • 參數適配:形態學核的尺寸、輪廓篩選的寬高比 / 范圍,需根據圖像分辨率、數字大小調整。
  • 模板質量:模板圖像的清晰度、數字完整性,直接影響匹配準確率。
  • 排序依賴myutils.sort_contours(自定義輪廓排序函數)是確保 “數字順序正確” 的關鍵。
  • 匹配方法TM_CCOEFF?適合黑白模板匹配,因它對亮度差異不敏感,更關注形狀相關性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98427.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云管平臺上線只是開始:從“建好”到“用好”的運營、推廣與深化指南

項目上線的喜悅轉瞬即逝,隨之而來的是一個更為現實和復雜的階段:運營。云管平臺(CMP)的成功,不再僅僅取決于其技術架構的先進性,更在于它能否融入組織的肌理,為不同角色持續創造價值。本文將從管理者、平臺團隊、開發者、運維和財務五個核心角色的視角,深入探討平臺上線…

distributed.client.Client 用戶可調用函數分析

distributed.client.Client 用戶可調用函數分析 1. 核心計算函數 任務提交和執行submit(func, *args, keyNone, workersNone, resourcesNone, retriesNone, priority0, fifo_timeout60s, allow_other_workersFalse, actorFalse, actorsFalse, pureNone, **kwargs) 提交單個函數…

數字圖像處理——信用卡識別

在數字支付時代&#xff0c;信用卡處理自動化技術日益重要。本文介紹如何利用Python和OpenCV實現信用卡數字的自動識別&#xff0c;結合圖像處理與模式識別技術&#xff0c;具有顯著實用價值。系統概述與工作原理信用卡數字識別系統包含兩大核心模塊&#xff1a;模板數字預處理…

嵌入式ARM64 基于RK3588原生SDK添加用戶配置選項./build lunch debian

1 背景 在我們正常拿到SDK后會有一些配置選項&#xff0c;在使用./build.sh lunch之后會輸出一些defautconfig讓我們選擇&#xff0c;瑞芯微的原廠sdk會提供一些主板的配置選項&#xff0c;但是我們的如果是一塊新的主板就需要添加自己的配置選項&#xff0c;本文就討論如何來添…

專為石油和天然氣檢測而開發的基于無人機的OGI相機

專為石油和天然氣檢測而開發的基于無人機的OGI相機基于無人機的 OGI 相機:&#xff08;Optical Gas Imaging&#xff0c;光學氣體成像&#xff09;其實是近幾年油氣、電力、化工等行業里非常熱門的應用方向。什么是 OGI 相機OGI&#xff08;Optical Gas Imaging&#xff09;&am…

iPhone17全系優缺點分析,加持遠程控制讓你的手機更好用!

知名數碼廠商蘋果&#xff0c;不久前已官宣將于北京時間9月10日凌晨1點開啟發布會&#xff0c;主打對于iPhone 17系列產品介紹&#xff0c;并且和以往不同的是&#xff0c;今年會在購物平臺上開啟線上直播&#xff0c;還是很有新意的。9.13全平臺渠道將開啟預售模式&#xff0c…

人工智能-python-深度學習-神經網絡VGG(詳解)

LeNet 系列之后 —— VGG&#xff08;詳解&#xff09;&#xff1a;從原理到 PyTorch 實現 文章目錄LeNet 系列之后 —— **VGG&#xff08;詳解&#xff09;**&#xff1a;從原理到 PyTorch 實現1. VGG 的發展歷史與意義&#xff08;一句話&#xff0b;背景&#xff09;2. VGG…

光伏運維迎來云端革命!AcrelCloud-1200如何破解分布式光伏四大痛點?

在國家“雙碳”目標推動下&#xff0c;分布式光伏正迎來爆發式增長&#x1f31e;。甘肅、吉林、云南等多地政策接連落地&#xff0c;整縣推進屋頂光伏試點如火如荼&#xff01;然而&#xff0c;快速發展的背后&#xff0c;你是否也遇到過這些“光伏運維之痛”&#xff1f;?【痛…

將 maven 集成到 idea 后出現 向項目創建模塊時出錯:null 的問題

1.出現的問題今天想將maven繼承到idea出現了一下問題&#xff1a;用生成器里面的也會報錯&#xff0c;找了找帖子并沒有哪位大佬出現類似錯誤&#xff0c;于是我解決完想分享一下&#xff0c;如果有不對&#xff0c;請指正。2.解決辦法很可能是java 的 版本 與 maven 版本有問題…

類似于 Progress Telerik Fiddler Classic 的 免費 或 開源 HTTP/HTTPS 抓包與調試工具推薦

以下是一些 類似于 Progress Telerik Fiddler Classic 的 免費 或 開源 HTTP/HTTPS 抓包與調試工具推薦&#xff1a;免費 / 開源替代工具推薦 1. Wireshark 免費且開源的網絡協議分析工具&#xff0c;支持 Windows、macOS、Linux 等平臺。可捕獲并深入分析網絡流量&#xff0c;…

7.0 熱電偶的工作原理

在工業生產過程中&#xff0c;溫度是需要測量和控制的重要參數之一。在溫度測量中&#xff0c;熱電偶的應用極為廣泛&#xff0c;它具有結構簡單、制造方便、測量范圍廣、精度高、慣性小和輸出信號便于遠傳等許多優點。另外&#xff0c;由于熱電偶是一種無源傳感器&#xff0c;…

commons-lang3

概述 提供了許多幫助程序實用程序&#xff0c;特別是字符串操作方法&#xff0c;基本數值方法&#xff0c;對象反射&#xff0c;并發&#xff0c;創建和序列化以及系統屬性。maven依賴<dependency><groupId>org.apache.commons</groupId><artifactId>c…

vue-amap組件呈現的效果圖如何截圖

我們用amap呈現了幾個圖層后&#xff0c;用戶覺得效果很好&#xff0c;想點個按鈕直接將這個畫面截圖下來。 首先我們用Canvas的toDataURL方法可以直接獲取圖像數據&#xff0c;但是實踐發現截圖后是空白的。 原因在警告中&#xff1a; 地圖的WebGL context 的preserveDrawin…

杰理燒錄ERROR: Data error after erasing, address = 0x430000

把CONFIG_BOARD_DEV_KIT關閉&#xff0c;打開CONFIG_BOARD_DEVELOP

超越自動化:為什么說供應鏈的終局是“AI + 人類專家”的混合智能?

摘要&#xff1a;當前&#xff0c;圍繞AI賦能供應鏈的討論&#xff0c;大多聚焦于“自動化”帶來的降本增效。然而&#xff0c;這僅僅是第一層。當我們的系統面對“黑天鵝”事件時&#xff0c;一個過度依賴自動化的“脆弱”系統可能會瞬間崩潰。本文旨在深入探討供應鏈演進的下…

Spine文件導入Unity流程

1、轉為Json文件導出 2、對文件進行處理 3、添加Spine的Package包 一、Spine文件導出設置 1、選擇Json文件 2、選擇導出所在路徑 3、點擊打包設置 更改圖集擴展名 二、文件導出后的設置 1、修改Json的Spine版本 這里必須是3.8 三、下載Unity支持包 1、鏈接 spine-unit…

Docker Compose healthcheck介紹(監控容器中服務的實際健康狀態)數據庫健康檢查pg_isready

文章目錄**功能概述****核心參數詳解****配置示例****1. 基礎用法****2. 使用數據庫健康檢查****3. 結合 depends_on 控制啟動順序****高級用法****1. 自定義健康檢查腳本****2. 多種健康檢查類型**- **HTTP 檢查**&#xff1a;- **TCP 端口檢查**&#xff1a;- **Redis 檢查**…

算法之雙指針

在算法設計中&#xff0c;雙指針是一種高效優化工具&#xff0c;主要用于線性數據結構&#xff08;如數組&#xff08;數組劃分和數組分塊常用&#xff09;、鏈表、字符串&#xff09;&#xff0c;通過控制兩個指針的移動軌跡&#xff0c;將原本需要 O (n) 時間復雜度的問題優化…

冪等性、順序性保障以及消息積壓

冪等性 概念 在應用程序中&#xff0c;冪等性就是指對一個系統進行重復調用&#xff08;相同參數&#xff09;&#xff0c;不論請求多少次&#xff0c;這些請求對系統的影響都是相同的效果. 比如數據庫的select操作.不同時間兩次查詢的結果可能不同&#xff0c;但是這個操作…

算法訓練營DAY58 第十一章:圖論part08

拓撲排序精講 卡碼網&#xff1a;117. 軟件構建(opens new window) 題目描述&#xff1a; 某個大型軟件項目的構建系統擁有 N 個文件&#xff0c;文件編號從 0 到 N - 1&#xff0c;在這些文件中&#xff0c;某些文件依賴于其他文件的內容&#xff0c;這意味著如果文件 A 依…