大四暑假的時候,幫老師指導了一個本科大學生創新實驗,主要目標是通過圖像處理相關技術對人臉美麗度進行分類。其中一個很重要的環節就是人臉的性別識別,這裡將這個部分單獨拿出來,借住OpenCv這個開源的圖像處理庫,在MFC框架下編寫了一個人臉性別識別的程序,本套教程將詳細介紹編寫過程。
需要提前說的一點是這個程序是在大四的時候編寫的,當時自己還沒有正式的進行圖像處理方面的研究,編程經驗也不夠豐富,因此程序只用了OpenCv提供的較為經典的人臉檢測和人臉識別算法,在准確度、程序設計、異常機制處理上可能顯得不夠完善。在制作這套教程之前我並沒有刻意去完善它,一是想好好審視下自己兩年前的編程水平,二是保持程序的簡潔性,使廣大讀者更容易看懂。教程編寫完成後,我會再花些時間來完善自己當年這個處女作。
一、程序效果演示
首先給出程序的最終效果:
從圖中可以看出程序一共分為如下幾個模塊:方法選擇、誤差補償及初始化模塊;視頻性別識別模塊;圖像性別識別模塊;輔助功能;圖片顯示區域;結果顯示區域。
二、功能介紹
1、方法選擇、誤差補償及初始化模塊 這裡一共有三個控件:初始化按鈕,方法選擇復選框,誤差補償值。初始化按鈕與初始化事件相關聯,主要是加載相關分類器(會在後面教程中詳細介紹),這裡的分類器主要包含一個人臉檢測分類器以及三個性別識別分類器。單擊初始化按鈕,初始化完成後程序會給出對應提示:
注意如果用戶在尚未進行初始化的情況下進行其他操作,程序會彈出對話框提示用戶先進行初始化:
緊接著是方法選擇列表,這裡面提供了四種人臉性別識別的方法供用戶選擇,分別是PCA變換、Fisher變換、LBP變換、支持向量機:
然後是誤差補償模塊,用來補償程序存在的一些固定誤差,主要用在視頻性別識別中,會在以後的教程中詳細介紹。這裡同樣以一個列表控件的形式供用戶選擇:
2、視頻性別識別模塊
這個模塊主要實現視頻信號的性別識別,默認由攝像頭采集視頻。主要包含兩個按鈕,一個是開始按鈕“打開視頻”,另一個是暫停按鈕。功能很簡單,單擊“打開視頻”按鈕,程序會自動檢測當前設備上所安裝的攝像頭,並調用指定攝像頭采集視屏,同時對視頻進行人臉檢測、性別識別,在圖片顯示區域顯示實時的人臉檢測結果,在結果顯示區域顯示性別識別結果。
這裡注意的是模塊中的暫停按鈕具有復用功能。因為這個程序具有兩個功能,對攝像頭視頻進行性別識別以及對單張圖片進行性別識別。當程序在處理視頻是,這個按鈕的功能是暫停/恢復當前視頻;在對單張圖片進行性別識別時,這個按鈕的功能是自動讀取文件夾下的下一張圖片。在視頻處理時按鈕的狀態為:
在識別單張圖片時按鈕的狀態為:
3、單張圖像性別識別模塊
這裡同樣包含兩個按鈕,一個“圖片文件夾”按鈕(這個按鈕同樣具有復用功能),一個靜態文本框區域,注意著兩個控件是相互關聯的。在對圖片進行性別識別時,程序提供了兩個工作模式:
模式一:選定一個文件夾,通過視頻性別識別模塊中的“下一張”按鈕自動加載文件夾下所有圖片,無需重復選擇。
模式二:直接選擇一個圖片文件進行操作。
程序初始默認為模式一,即文件夾模式。此時單擊模塊中的“圖像文件夾”按鈕,將會彈出對話框,提示我們選擇一個文件夾:
我們在“雙擊此處轉換模式”的靜態文本框區域雙擊鼠標,將會切換到模式二:
此時按鈕的文本變為“圖片文件”,單擊會打開一個對話框要求用戶具體選擇一張圖片來進行處理:
注意這裡兩個模式下所彈出的文件對話框是不同的。再次雙擊可切換回原來的模式。
4、輔助功能模塊
這部分模塊中主要包含三個按鈕:人臉批量分割、文件名修改、方法驗證。
這些都是我在編寫程序的過程中用到的一些輔助性功能。單擊“人臉批量分割”按鈕,會彈出一個文件選擇對話框,提示用戶選擇一個文件夾,然後程序會自動檢測文件夾下的所有圖片文件,對其進行人臉檢測,並將檢測到的人臉區域圖片批量保存到程序制定路徑下。同樣,如果單擊“文件名修改”按鈕,同樣會彈出一個對話框,提示用戶選擇文件夾,然後程序會對所有圖片的名稱按照指定格式進行統一修改,並保存。至於“方法驗證”按鈕,是一個測試按鈕,主要是在開發程序的過程中用作調試按鈕。
5、圖片顯示區域和結果顯示區域
主要由一個picture控件和三個編輯框組成,用來顯示當前的圖像信息以及識別結果。其中“男/女識別率”這兩個控件是用來在仿真試驗中測試識別方法的效果的,將會在後續章節進行詳細介紹。
三、小結
本篇教程主要介紹了程序的最終效果,讓大家對本教程的最終目的有一個大致的了解。最後再次強調,這個程序是我本科階段編寫的,肯定會有很多不足之處,在處理圖像時也用的都是經典算法。如果你希望從教程中了解人臉檢測、人臉識別等方面最前沿的算法,那這篇教程可能會讓你失望。但如果你希望了解MFC的入門級編程方法、圖像處理的基本知識以及OpenCv的基本應用,相信你能從這套教程中學到一些東西。