1. 程式人生 > >Opencv+C++之身份證識別(一)

Opencv+C++之身份證識別(一)

五月份各種課程,也是最後一個學期了,所以就沒有跟大家分享自己的一些所學。現在課程終於結束了,即將開始下一階段的專案開發,所以趁這個間隙把前段時間做的一些東西做一個總結吧。

言歸正傳,對各種證件的識別系統大家都不陌生,尤其是對車牌號的識別已經應用到我們生活的很多方面,例如小區攝像頭對入庫車輛車牌的識別,高速收費站前對車牌識別的攝像頭等。那麼對身份證資訊的識別跟其它識別有什麼區別呢,我想主要是對身份證的識別是在一個相對靜態的環境下,受環境,光照等的擾動比較小,一般都是先對身份證攝像後,通過系統對身份證上的資訊進行識別;第二點就是它跟其它證件一樣,證件上的資訊都有固定的顏色和位置,這樣對我們第二步的分割就有很大的幫助。分析了身份證的固有特性後,簡單說下我們系統的功能:1)將各個目標資訊從身份證圖片中分割出來,例如姓名資訊,住址資訊等;2)對分割出來的資訊進行識別,最基礎的要求是能統計出各個目標中漢字個數,數字個數,字母個數和特殊字元個數等,本次開發,我只是實現了對數字的識別並對漢字的識別提出自己的可行性方法,因為時間緣故沒有花很多時間去實現對漢字的識別;

先給出幾張我們實驗用的照片:

當然這三張只是實驗圖片的一部分,但是又是很有代表性,第一張屬於比較標準的,清晰的身份證圖片,第二幅圖片中身份證邊界沒有跟圖片邊界貼近,並且受到了光照不均的影響,第三張中身份證角度稍微有些傾斜,並且身份證的邊界沒有被照到。實際上這三張就代表了我們實際應用的測試圖片,因為我們要使用識別系統,是人為的去對身份證拍攝,再將圖片資訊進行系統處理的,所以我們可以假定攝像時身份證同攝像頭平行,並且身份證區域佔整個圖片區域的5/6以上;

下面就開始我們的實踐階段,該系統的開發主要分為三個階段:影象預處理;目標區域分割;目標區域資訊識別;

(1)預處理階段主要是要將圖片中的一些噪音,擾動過濾掉。

  1)要提取目標區域資訊,首先想到將影象進行灰度化,常用的灰度化方法很多,像分量法,加權法,均值法等等。但是通過實驗發現,直接提取彩色圖的R通道灰度圖是最好的選擇,因為該灰度圖中前景和背景的對比度最大。如下圖所示

通過灰度化後可以明顯看出,我們先要提取的前景資訊,相對於背景來說有明顯的灰度對比(暫時先不用考慮頭像部分,因為該部分位置相對固定,通過位置資訊可以將其過濾)

 2)通過獲取區域性最佳閾值來作為自適應的全域性閾值;根據我們對身份證圖片的假定和位置資訊可以知道,在圖片中心區域的左側可以提取一個矩形區域,其中一定包含前景資訊,通過獲取該區域的最佳閾值,就可以近似作為整副圖片的全域性閾值;當然這樣做也只是對影象做一個粗糙的過濾,因為受光照等的影響,區域性閾值跟全域性閾值會有一定的差異。但在後面的各個區域的獲取中,我們有方法來進一步精確。

步驟如下1.在該區域內選擇一個T作為初始估計值;

           2.用T分割影象,這樣做會生成兩組畫素:G1由所有灰度值大於T的畫素組成,而G2由所有灰度值小於或者等於T的畫素組成。

           3.對於區域G1和G2中的所有畫素計算平均灰度值u1和u2

           4.計算新的門限值: T=(u1+u2)/2

           5.重複步驟2到4,直到逐次迭代所得的T值之差小於事先定義好的引數P

通過閾值處理得到如下結果

(2)對影象進行預處理後,下一步就是對目標區域的提取。這一步我主要是用到了身份證中各個區域的位置資訊,利用身份證號的特殊位置,和它本身相對固定的組成(18個數字或字母)先提取出身份證號的區域,在根據該區域與其它區域的相對位置獲得其它目標物件的區域範圍。這樣就完成了第一步的分割任務。示例圖如下

相關推薦

Opencv+C++身份證識別

五月份各種課程,也是最後一個學期了,所以就沒有跟大家分享自己的一些所學。現在課程終於結束了,即將開始下一階段的專案開發,所以趁這個間隙把前段時間做的一些東西做一個總結吧。 言歸正傳,對各種證件的識別系統大家都不陌生,尤其是對車牌號的識別已經應用到我們生活的很多方面,例如小區攝像頭對入庫車輛車牌的識別,高速收

影象處理其他雜項MeanShift的目標跟蹤演算法opencv c++程式碼 VS2015+opencv3.2

//#include "stdafx.h" //#include "cv.h" //#include "highgui.h" #include<opencv.hpp> #define u_char unsigned char #define DIST 0.5 #define

C#系列基礎知識點

命名規則 系列 字符 註釋 編輯器 小數類型 智能 規則 解釋 知識點一:VS啟動方法 第一種:雙擊圖標 第二種:window+R——調出cmd,輸入devenu properties 屬性的意思 知識點二:後綴名解釋 .sln 解決方案文件:包含整個解決方案的信息 .

C#全棧開發後臺驗證

開發 家庭 strac sta vat 怎麽 mar 地址 要求 在Web系統開發時,往往會有存在大量的交互操作,交互就必須校驗數據的準確性啊,且不說一個字段可能存在多種校驗,若一個表單提交有10個字段難道我們要對這10個字段分別寫代碼去校驗嗎?如果是這樣,那每一個表單都要

Java伺服器部署基於OpenCVC++影象處理專案

Java伺服器部署基於OpenCV的C++影象處理專案(一) 由於最近專案需要在後臺處理圖片並返回結果給移動端,所以折騰了一週如何將c++程式碼和opencv打包並部署到java伺服器中供後臺呼叫,這裡記錄下詳細過程。 基礎環境 伺服器環境: 阿里雲伺服器 Red Hat 4

Python C/S 網路程式設計 三種方法實現天氣預報小程式

1. 首先明白下協議棧和庫的概念: 協議棧(Protocol Stack): 是指網路中各層協議的總和,其形象的反映了一個網路中檔案傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議。 庫(Library):主要用來解析要使用的網路通訊協議,包含Python內建標準庫

使用opencv作物件識別 —— 積分直方圖加速HOG特徵計算

使用opencv作物件識別(一) —— 積分直方圖加速HOG特徵計算 方向梯度直方圖(Histograms of Oriented Gradients,簡稱HOG特徵)結合支援向量機( support vector machine, 簡稱SVM),被廣泛應用於影象識別中,尤

C語言學習入們到精通學習筆記

為什麼我通過部落格的形式與大家分享我的學習筆記     對於c語言的學習已經有快3年之久了,對於學習嵌入式的我看來,C是我們的根本也就是我們的核心知識點,想學習好嵌入式就必須精通C語言。在一年之前我對C語言的認識只停留在表面,只會用C語言寫寫51微控制器或STM32的控制程

c++基礎要點整理——內部類

一. 內部類的定義       包含在一個類裡面都類稱為內部類,其定義形式為: class A { public: class InClass { void funcB

opencv 人臉識別 訓練樣本的處理

本文實現基於eigenface的人臉檢測與識別。給定一個影象資料庫,進行以下步驟:進行人臉檢測,將檢測出的人臉存入資料庫2對資料庫2進行人臉建模在測試集上進行recognition本篇實現第一步:進行人臉檢測,將檢測出的人臉存入資料庫2環境:vs2010+opencv 2.4

C++ Primer順序容器:常用順序容器概述

最近我在閱讀《C++ Primer》的時候閱讀到了第九章的順序容器,最大的感覺就是難度不大,但知識點非常的凌亂,感覺沒有頭緒。我希望通過這篇部落格能夠整理自己的思緒。 書中主要講到了六種容器vector、deque、list、forward_list、arra

python進階—OpenCV影象處理

文章目錄 顏色空間轉換 RGB色彩空間 HSV色彩空間 YUV色彩空間 簡單的物體跟蹤示例 HSV空間目標閾值選取 影象幾何變換 影象的縮放 影象的位移 影象的旋轉 影

C++ 求最短路徑問題Dijkstra演算法

求最短路徑之Dijkstra演算法 Dijkstra演算法是用來求單源最短路徑問題,即給定圖G和起點s,通過演算法得到s到達其他每個頂點的最短距離。 基本思想:對圖G(V,E)設定集合S,存放已被訪問的頂點,然後每次從集合V-S中選擇與起點s的最短距離最小的一個頂點(記為u

行人重識別學習路:基礎知識和相關資料整理

2018年4月16號,本人研一,今天正式確定了研究方向,從今天起,開始自己的行人重識別的學習之路,因為也是剛開始學習,所以這些筆記也都是在借鑑了經驗人士的文章後,再結合自己的理解和思路做出的整理,有不對的地方還請多多指教,本人會及時修改。1、行人重識別是什麼? 行

C語言資料結構稀疏矩陣

最近開始學習C語言的稀疏矩陣的一些知識,現在簡單的整理梳理一下知識脈絡,僅供自己總結學習,歡迎技術指正,拒絕盲噴。 1.首先先介紹一下關於稀疏矩陣的一些基礎知識,關於稀疏矩陣,一直都沒有過很清楚詳細的定義。簡單的說,在M*N的一個矩陣中,假設有t個元素不為0,那麼有計算公

C語言網路程式設計域名解析

在網路程式設計時,知道域名是不能直接訪問一個主機的,需要轉換成相應的IP地址。有時在程式中需要將一個IP地址轉換成一個域名。本節將講解C程式中的IP地址與域名的轉換問題。 提示:在TCP/IP網路中,通訊雙方的主機必須知道彼此的IP地址方可進行正常的通訊,如果給出的主機的域

C++Boost庫學習thread庫

目錄 1.thread庫 ^   Boost.Thread允許在可移植C ++程式碼中使用多個執行執行緒和共享資料。它提供了用於管理執行緒本身的類和函式,以及用於線上程之間同步資料或提供特定於各個執行緒的資料的單獨副本的其他類。 #include

OpenCV儀表資料識別:整體思想

一、目標:利用OpenCV完成對儀表上八段數碼管資料的識別。 二、整體思想: 1. 影象預處理 2. 數字識別 3. 將數字按照正確的精度儲存並顯示到螢幕 程式流程圖如下: 接下來

C# winform 開發Excel操作------開啟Exce表

在開始之前,先要匯入Excel的類庫。步驟如下: 把滑鼠移動解決方案---->右擊----->選擇“新增引用”---->會出現一個對話方塊---->選擇標題為.net的頁面----->然後選擇“Microsoft.Office.Interop.E

基於C/C++語言資料結構線性表

資料結構學習筆記: 資料結構的重要性:資料結構我感覺很重要,不僅僅是考試很重要,而且在以後程式設計師事業上都是尤為重要的,知乎上有網友評價資料結構是最重要的程式設計基本能力,沒有之一。我感覺這個說法很對,並且大家都知道,資料結構與演算法這種說法常常被大家使用,就是因為資料