歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV人臉識別LBPH算法源碼分析

OpenCV人臉識別LBPH算法源碼分析

日期:2017/3/1 9:14:21   编辑:Linux編程

1 背景及理論基礎

人臉識別是指將一個需要識別的人臉和人臉庫中的某個人臉對應起來(類似於指紋識別),目的是完成識別功能,該術語需要和人臉檢測進行區分,人臉檢測是在一張圖片中把人臉定位出來,完成的是搜尋的功能。從OpenCV2.4開始,加入了新的類FaceRecognizer,該類用於人臉識別,使用它可以方便地進行相關識別實驗。

原始的LBP算子定義為在3*3的窗口內,以窗口中心像素為阈值,將相鄰的8個像素的灰度值與其進行比較,若周圍像素值大於或等於中心像素值,則該像素點的位置被標記為1,否則為0。這樣,3*3鄰域內的8個點經比較可產生8位二進制數(通常轉換為十進制數即LBP碼,共256種),即得到該窗口中心像素點的LBP值,並用這個值來反映該區域的紋理特征。如下圖所示:

原始的LBP提出後,研究人員不斷對其提出了各種改進和優化。

1.1 圓形LBP算子

基本的 LBP算子的最大缺陷在於它只覆蓋了一個固定半徑范圍內的小區域,這顯然不能滿足不同尺寸和頻率紋理的需要。為了適應不同尺度的紋理特征,Ojala等對LBP算子進行了改進,將3×3鄰域擴展到任意鄰域,並用圓形鄰域代替了正方形鄰域,改進後的LBP算子允許在半徑為R的圓形鄰域內有任意多個像素點,從而得到了諸如半徑為R的圓形區域內含有P個采樣點的LBP算子,OpenCV中正是使用圓形LBP算子,下圖示意了圓形LBP算子:

1.2 旋轉不變模式

從LBP的定義可以看出,LBP算子是灰度不變的,但卻不是旋轉不變的,圖像的旋轉就會得到不同的LBP值。Maenpaa等人又將LBP算子進行了擴展,提出了具有旋轉不變性的LBP算子,即不斷旋轉圓形鄰域得到一系列初始定義的LBP值,取其最小值作為該鄰域的LBP值。下圖給出了求取旋轉不變LBP的過程示意圖,圖中算子下方的數字表示該算子對應的LBP值,圖中所示的8種LBP模式,經過旋轉不變的處理,最終得到的具有旋轉不變性的LBP值為15。也就是說,圖中的8種LBP模式對應的旋轉不變的LBP碼值都是00001111。

1.3 等價模式

一個LBP算子可以產生不同的二進制模式,對於半徑為R的圓形區域內含有P個采樣點的LBP算子將會產生P2種模式。很顯然,隨著鄰域集內采樣點數的增加,二進制模式的種類是急劇增加的。例如:5×5鄰域內20個采樣點,有220=1,048,576種二進制模式。如此多的二值模式無論對於紋理的提取還是對於紋理的識別、分類及信息的存取都是不利的。為了解決二進制模式過多的問題,提高統計性,Ojala提出了采用一種“等價模式”(Uniform Pattern)來對LBP算子的模式種類進行降維。Ojala等認為,在實際圖像中,絕大多數LBP模式最多只包含兩次從1到0或從0到1的跳變。因此,Ojala將“等價模式”定義為:當某個局部二進制模式所對應的循環二進制數從0到1或從1到0最多有兩次跳變時,該局部二進制模式所對應的二進制就成為一個等價模式類。如00000000(0次跳變),00000111(含一次從0到1的跳變和一次1到0的跳變),10001111(先由1跳到0,再由0跳到1,共兩次跳變)都是等價模式類。除等價模式類以外的模式都歸為另一類,稱為混合模式類,例如10010111(共四次跳變)。

通過這樣的改進,二進制模式的種類大大減少,模式數量由原來的2P種減少為P(P-1)+2+1種,其中P表示鄰域集內的采樣點數,等價模式類包含P(P-1)+2種模式,混合模式類只有1種模式。對於3×3鄰域內8個采樣點來說,二進制模式由原始的256種減少為59種,這使得特征向量的維數更少,並且可以減少高頻噪聲帶來的影響。

OpenCV官方教程中文版(For Python) PDF http://www.linuxidc.com/Linux/2015-08/121400.htm

Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm

Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm

CentOS下OpenCV無法讀取視頻文件 http://www.linuxidc.com/Linux/2011-07/39295.htm

Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm

Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm

基於QT和OpenCV的人臉識別系統 http://www.linuxidc.com/Linux/2011-11/47806.htm

[翻譯]Ubuntu 14.04, 13.10 下安裝 OpenCV 2.4.9 http://www.linuxidc.com/Linux/2014-12/110045.htm

示例程序(包含人臉庫)下載地址

到Linux公社1號FTP服務器下載

------------------------------------------分割線------------------------------------------

FTP地址:ftp://ftp1.linuxidc.com

用戶名:ftp1.linuxidc.com

密碼:www.linuxidc.com

在 2016年LinuxIDC.com\7月\OpenCV人臉識別LBPH算法源碼分析\

下載方法見 http://www.linuxidc.com/Linux/2013-10/91140.htm

------------------------------------------分割線------------------------------------------

2 LBP特征用於檢測的原理

顯而易見的是,上述提取的LBP算子在每個像素點都可以得到一個LBP“編碼”,那麼,對一幅圖像(記錄的是每個像素點的灰度值)提取其原始的LBP算子之後,得到的原始LBP特征依然是“一幅圖片”(記錄的是每個像素點的LBP值),如圖所示:

如果將以上得到的LBP圖直接用於人臉識別,其實和不提取LBP特征沒什麼區別,在實際的LBP應用中一般采用LBP特征譜的統計直方圖作為特征向量進行分類識別,並且可以將一幅圖片劃分為若干的子區域,對每個子區域內的每個像素點都提取LBP特征,然後,在每個子區域內建立LBP特征的統計直方圖。如此一來,每個子區域,就可以用一個統計直方圖來進行描述,整個圖片就由若干個統計直方圖組成,這樣做的好處是在一定范圍內減小圖像沒完全對准而產生的誤差,分區的另外一個意義在於我們可以根據不同的子區域給予不同的權重,比如說我們認為中心部分分區的權重大於邊緣部分分區的權重,意思就是說中心部分在進行圖片匹配識別時的意義更為重大。 例如:一幅100*100像素大小的圖片,劃分為10*10=100個子區域(可以通過多種方式來劃分區域),每個子區域的大小為10*10像素;在每個子區域內的每個像素點,提取其LBP特征,然後,建立統計直方圖;這樣,這幅圖片就有10*10個子區域,也就有了10*10個統計直方圖,利用這10*10個統計直方圖,就可以描述這幅圖片了。之後,我們利用各種相似性度量函數,就可以判斷兩幅圖像之間的相似性了,OpenCV在LBP人臉識別中使用的是如下相似度公式:

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-07/133127p2.htm

Copyright © Linux教程網 All Rights Reserved