歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 基於QT和OpenCV的人臉識別系統

基於QT和OpenCV的人臉識別系統

日期:2017/3/1 10:56:47   编辑:Linux編程

基於QT和OpenCV的人臉識別系統

The Face Recognition System Based on QT and OpenCV


關鍵詞:ARM,QT,OpenCV,人臉識別,PCA

1 系統方案設計

1.1 引言

人臉是一個常見而復雜的視覺模式,人臉所反映的視覺信息在人與人的交流和交往中有著重 要的作用和意義,對人臉進行處理和分析在視頻監控、出入口控制、視頻會議以及人機交互等領 域都有著廣泛的應用前景,因此是模式識別和計算機視覺領域持續的研究熱點。

本系統在 FriendlyARM Tiny6410 開發板基礎上,利用 OpenCV 計算機視覺庫和 QT 圖形庫,通 過普通的 USB 攝像頭實現了自動人臉識別,准確率較高,方便易用。

1.2 系統總體架構

“人臉識別”大致可分為兩個階段:

1. 人臉檢測 搜索一幅圖像,尋找一切人臉區域(此處以綠色矩形顯示),然後進行圖像處理,清理臉部圖像以便於更好地識別。

2. 人臉識別 把上一階段檢測處理得到的人臉圖像與數據庫中的已知 人臉進行比對,判定人臉對應的人是誰(此處以白色文本顯示)。

1.3 工作流程

系統運行時,自動從 USB 攝像頭獲取 YUV 格式的圖片,轉換成 QImage 格式並實時顯示在 LCD屏上,再將其轉換成 IplImage 格式,利用 OpenCV 的 Haar Cascade Face Detector(也稱為 Viola-Jones 方法)進行人臉檢測,得到一個矩形區域,截取該矩形區域圖像進行直方圖均衡化處理,進行訓練或識別。

系統訓練流程:

點擊觸摸屏上的按鈕獲取一幀圖片,由訓練者判斷是否加入訓練集。當訓練集圖片足夠後, 點擊訓練按鈕,即使用 PCA 方法處理訓練集中的人臉圖片,生成 XML 文件。

系統識別流程:

點擊觸摸屏上的按鈕,進入識別狀態。得到上述的人臉區域圖像後,讀取 XML 文件,使用PCA 方法將圖像與數據庫比對,若可信度超過阈值,則在屏幕上顯示出人名。

攝像頭可獲取多幅圖像以提高准確度和可靠性,我們采集多幅圖像求可信度平均值與阈值比 較,若可信度平均值大於阈值,則登錄系統成功,通過串口發送信號並彈出對話框提示信息;若 在規定時間內未登錄成功,則記錄訪問者的人臉並提示登錄失敗。

2 系統原理與算法實現

2.1 基於 Haar 特征級聯強分類器的人臉檢測


多分類器級聯結構是很多強分類器的組合,其結構如下圖所示:

它是一種由粗到細的結構,其中每一層是 AdaBoost 算法訓練得到的一個強分類器,都經過阈 值調整,使得每一層能讓全部正例樣本通過,而拒絕很大一部分非人臉樣本。

本作品使用 OpenCV 中的檢測器,使用其自帶的一個 XML 文件執行檢測。

2.2 基於 PCA 方法的人臉識別

PCA 方法由 Turk 和 Pentlad 首先提出,它的基礎就是 Karhunen-Loeve 變換(簡稱 KL 變換)。 一幅人臉圖像(假設為 50x50 像素)是一個 2500 維空間的數據點,我們利用 PCA 方法將所有人臉 圖像數據點投影到 PCA 子空間中進行降維和特征提取。

相對於歐式距離,利用馬氏距離作為人臉圖像間的距離識別效果較好,但由於本作品主要用 於判斷待測人臉是否為數據庫中人臉,可信度的計算方法極為關鍵,而目前最好的可信度的計算 方程是基於歐式距離的:

float confidence = 1.0f – sqrt( it→distance /

(float) (trainFacesNum * eigenVectorsNum) ) / 255.0f;

故本作品仍采用歐式距離。

OpenCV 的人臉檢測器獲取到人臉圖像後,使用直方圖均衡化進行圖像的預處理,然後調用OpenCV 的庫函數進行識別,用上述公式計算出待測人臉可信度。

3 系統測試

第 1~4 次測試中,人臉數據庫中只有 ORL 數據庫的四個人和 A 的人臉數據,此時 B、C 均為“陌生人”,只有 A 能登錄系統。

第 5~9 次測試中,人臉數據庫中增加了 B 的數據,此時只有 C 為“陌生人”,A、B 均可登 錄系統。

測試結果如下圖:

測試序號

人員編號

登錄耗時(s)

識別幀數

平均可信度

誤識別次數

1

A

16

2

0.856

0

2

A

-

10

0.846

0

3

B

10

0.675

0

4

C

10

0.778

0

5

A

-

10

0.878

0

6

B

-

10

0.906

0

7

C

10

0.824

0

8

A

14

2

0.883

0

9

B

11

2

0.913

0



注:

1. 登錄耗時指某人從坐到攝像頭前,擺正角度到登錄成功所用時間。

2. 識別幀數表示用於計算平均可信度的圖像幀數,均由攝像頭連續獲取。

3. 系統的可信度阈值設為 0.85。

4 結語

本作品以友善之臂的 Tiny6410 開發板為平台,使用普通的 USB 攝像頭,設計了一個自動人臉識別系統。系統實現了訓練、識別人臉的功能,並在實驗室環境下完成了測試。

經測試,使用者在未訓練時無法登錄系統,其可信度與人臉數據庫中已有人員的可信度有一 定差值,可以區分數據庫內外人臉。使用者經過訓練後即可登錄系統。

利用攝像頭可以連續獲取圖像的特性,本作品多次計算可信度取平均值的方法一定程度上提高了識別的可靠性。

當然,本作品仍有很多不足的地方,比如由於驅動程序不完善,單靠軟件實現的圖像采集速度較慢,導致實時性不高;以及未實現活體檢測,存在使用主人照片登錄系統的可能。

Copyright © Linux教程網 All Rights Reserved