4步OpenCV-----掃秒身份證號

這段代碼用 OpenCV 做了一份“數字模板字典”,然后在銀行卡/身份證照片里自動找到身份證號那一行,把每個數字切出來跟模板比對,最終輸出并高亮顯示出完整的身份證號碼,下面是代碼解釋:

模塊 1 工具箱(通用函數)

目的:

  • cv_show:調試時彈窗查看中間圖像

  • sort_contours:按指定順序(左→右、上→下等)排列輪廓,避免 OpenCV 隨機順序

代碼

def cv_show(name, image):cv2.imshow(name, image)cv2.waitKey(0)def sort_contours(cnts, method='left-to-right'):reverse = Falsei = 0if method in ('right-to-left', 'bottom-to-top'):reverse = Trueif method in ('top-to-bottom', '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

注意

  • 返回值為元組,后續用 [0] 取排序后的輪廓

  • 若數字多行,可將 method 改為 'top-to-bottom'


模塊 2 模板制作(生成 0-9 標準模板)

目的

從干凈模板圖中切出單個數字 → 統一尺寸(57×88)→ 白底黑字,供后續模板匹配

步驟

  1. 讀圖

    img = cv2.imread("picture/TP.png")
    gray = cv2.imread("picture/TP.png", 0)
  2. 二值化(數字變白)

    ref = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)[1]
  3. 找輪廓并排序

    _, refCnts, _ = cv2.findContours(ref, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    refCnts = sort_contours(refCnts, method='left-to-right')[0]
  4. 生成模板字典

    digits = {}
    for (i, c) in enumerate(refCnts):x, y, w, h = cv2.boundingRect(c)roi = ref[y-2:y+h+2, x-2:x+w+2]roi = cv2.resize(roi, (57, 88))roi = cv2.bitwise_not(roi)  # 白底黑字digits[i] = roi

注意

  • 模板圖需無粘連、無干擾

  • 若含小數點/空格,需額外過濾以保證 digits 長度為 10


模塊 3 輸入圖預處理(定位身份證號區域)

目的

在整幅銀行卡/身份證中,僅保留“身份證號”水平條帶,減少誤檢

步驟

  1. 讀圖

    img = cv2.imread('picture/card_id.jpg')
    gray = cv2.imread('picture/card_id.jpg', 0)
  2. 二值化

    ref = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)[1]
  3. 找輪廓

    _, refCnts, _ = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  4. 幾何過濾(針對當前圖寫死坐標)

注意

  • 330/360/220 為經驗值,換圖需調整

  • 光照不均時建議自適應閾值或亮度歸一化


模塊 4 單字符切割 + 模板匹配識別

目的

將單行 ROI 切成單個字符,與模板庫 0-9 匹配,得分最高者即為識別結果,并繪制邊框與文字

步驟

  • 遍歷每個候選矩形

    output = []
    for (i, (gX, gY, gW, gH)) in enumerate(locs):group = gray[gY-2:gY+gH+2, gX-2:gX+gW+2]group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]roi = cv2.resize(group, (57, 88))
  • 模板匹配打分

    scores = []
    for (digit, digitROI) in digits.items():result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)(_, score, _, _) = cv2.minMaxLoc(result)scores.append(score)
    jieguo = str(np.argmax(scores))
    output.append(jieguo)
  • 繪制結果

    cv2.rectangle(imgg, (gX-5, gY-5), (gX+gW+5, gY+gH+5), (0, 0, 255), 1)
    cv2.putText(imgg, jieguo, (gX, gY-15), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)
  • 打印整串號碼

    print("Card ID #: {}".format("".join(output)))
    cv2.imshow("Image", imgg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    注意

    • 若印刷為黑底白字,需再次 bitwise_not

    • 僅支持數字 0-9;含字母/X 需擴展模板或改用 CNN

    • 連體數字需先投影分割再識別

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

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

    相關文章

    馮諾依曼體系:現代計算機的基石與未來展望

    馮諾依曼體系:現代計算機的基石與未來展望 引人入勝的開篇 當你用手機刷視頻、用電腦辦公時,是否想過這些設備背后共享的底層邏輯?從指尖輕滑切換APP,到電腦秒開文檔,這種「無縫銜接」的體驗,其實藏著一個改…

    前端基礎 —— C / JavaScript基礎語法

    以下是對《3.JavaScript(基礎語法).pdf》的內容大綱總結:---📘 一、JavaScript 簡介 - 定義:腳本語言,最初用于表單驗證,現為通用編程語言。 - 應用:網頁開發、游戲、服務器(Node.js&#xff09…

    springboot 二手物品交易系統設計與實現

    springboot 二手物品交易系統設計與實現 目錄 【SpringBoot二手交易系統全解析】從0到1搭建你的專屬平臺! 🔍 需求確認:溝通對接 🗣 📊 系統功能結構:附思維導圖 ☆開發技術: &#x1f6e…

    【Android】可折疊式標題欄

    在 Android 應用開發中,精美的用戶界面可以顯著提升應用品質和用戶體驗。Material Design 組件中的 CollapsingToolbarLayout 能夠為應用添加動態、流暢的折疊效果,讓標題欄不再是靜態的元素。本文將深入探討如何使用 CollapsingToolbarLayout 創建令人驚…

    Debian13下使用 Vim + Vimspector + ST-LINK v2.1 調試 STM32F103 指南

    1. 硬件準備與連接 1.1 所需硬件 STM32F103C8T6 最小系統板ST-LINK v2.1 調試器連接線(杜邦線) 1.2 硬件連接 ST-LINK v2.1 ? STM32F103C8T6 連接方式:ST-LINK v2.1 引腳STM32F103C8T6 引腳功能說明SWDIOPA13數據線SWCLKPA14時鐘線GNDGND共地…

    第21課:成本優化與資源管理

    第21課:成本優化與資源管理 課程目標 掌握計算資源優化 學習成本控制策略 了解資源調度算法 實踐實現成本優化系統 課程內容 21.1 成本分析框架 成本分析系統 class CostAnalysisFramework {constructor(config) {this.config

    SAP HANA Scale-out 04:CalculationView優化

    CV執行過程計算視圖激活時,生成Stored ModelSELECT查詢時:首先將Stored Model實例化為runtime Model 計算引擎執行優化,將runtime Model轉換為Optimized Runtime ModelOptimized Runtime Model通過SQL Optimizer進行優化計算引擎優化特性說明…

    鴻蒙審核問題——Scroll中嵌套了List/Grid時滑動問題

    文章目錄背景原因解決辦法1、借鑒Flutter中的解決方式,如下圖2、鴻蒙Next中對應的解決方式,如下圖3、官方文檔回訪背景 來源一次審核被拒的情況。也是出于粗心導致的。之前在flutter項目中也是遇到過這種問題的。其實就是滾動視圖內嵌滾動視圖造成的&am…

    測試電商購物車功能,設計測試case

    在電商場景中,購物車是連接商品瀏覽與下單支付的關鍵環節,需要從功能、性能、兼容性、安全性等多維度進行測試。以下是購物車功能的測試用例設計: 一、功能測試 1. 商品添加到購物車 - 未登錄狀態下,添加商品到購物車(…

    Linux --- 常見的基本指令

    一. 前言本篇博客使用的 Linux 操作系統是 centos ,用來學習Linux 的 Linux 系統的內核版本和系統架構信息版本如下所示:上圖的主要結構為:主版本號-次版本號 修正次數,3.10.0 是操作系統的主版本號;當我們在維護一段L…

    微信小程序 -開發郵箱注冊驗證功能

    一、前端驗證:正則表達式與插件結合正則表達式設計 使用通用郵箱格式校驗正則,并允許中文域名(如.中國): const emailReg /^[a-zA-Z0-9._%-][a-zA-Z0-9-](?:\.[a-zA-Z0-9-])*\.[a-zA-Z]{2,}(?:\.[a-zA-Z]{2})?$/i;…

    docker 部署 code-server

    docker 部署 code-servercode-serverError response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headersdocker 配置正確步驟 阿里云源permission de…

    網絡編程專題:從源碼解析網絡編程常用方法(基于6.16.3內核)

    前言 本文是因為作者在研究下面這個代碼時發現的問題: int main() {// 1. 創建 IPv4 專用地址結構體 sockaddr_instruct sockaddr_in ipv4_addr;memset(&ipv4_addr, 0, sizeof(ipv4_addr)); // 初始化清零// 2. 填充 IPv4 專屬信息ipv4_addr.sin_family AF_IN…

    2025年數字公共治理專業重點學什么內容?(詳細指南)

    數字公共治理作為一個新興的跨學科領域,近年來受到越來越多高校和學生的關注。這個專業融合了多個學科的知識體系,旨在培養掌握現代治理理念和技術應用能力的復合型人才。對于在校大學生而言,了解這一專業的學習內容和發展方向,有…

    一招解決 win 下 終端打印中文亂碼問題

    適合所有終端 cmd powershell git bash, 原理:修改電腦的區域設置,勾選使用 UTF-8 1.電腦搜索 區域, 打開區域設置2. 打開相關設置3. 點擊更改 日期、時間或數字格式4. 選則管理-點擊更改系統區域設置,在彈出框中勾選 …

    Elasticsearch面試精講 Day 13:索引生命周期管理ILM

    【Elasticsearch面試精講 Day 13】索引生命周期管理ILM 在“Elasticsearch面試精講”系列的第13天,我們將深入探討 索引生命周期管理(Index Lifecycle Management, ILM) 這一核心運維機制。作為大規模日志、監控和時序數據場景下的必備功能&…

    Python快速入門專業版(二十八):函數參數進階:默認參數與可變參數(*args/**kwargs)

    目錄引一、默認參數:給函數參數設置“默認值”1. 基本語法與使用示例示例1:帶默認參數的乘法函數2. 默認參數的核心規則:必須放在非默認參數之后示例2:默認參數位置錯誤(報錯)3. 默認參數的“可變對象陷阱”…

    FreeRTOS 知識點

    一、配置過程二、基本知識點2.1 搶占優先級和響應優先級在 FreeRTOS 中,任務的調度方式主要有 ??搶占式(Preemptive)?? 和 ??協作式(Cooperative)?? 兩種模式,它們的核心區別在于 ??任務如何釋放…

    SQL注入漏洞手動測試詳細過程

    這是一次詳細的、基于真實手動測試思維的SQL注入漏洞測試過程記錄。我們將以一個假設的Web應用程序為例,進行逐步探測和利用。測試目標假設我們正在測試一個名為 example.com 的電商網站,其有一個查看商品詳情的頁面,URL 為: http…

    機器人控制器開發(通訊——ros話題轉為websocket)

    1 為什么要實現ROS話題轉WebSocket 主要有如下5個優點:跨平臺通信需求 WebSocket作為一種標準的Web通信協議,允許任何支持WebSocket的客戶端(網頁、移動應用、其他系統)與ROS機器人進行實時通信,打破了ROS傳統通信方式…