蔡宗吟 羅國平
【摘 要】人臉識別技術在人工智能、機器識別、機器學習等領域具有廣泛的應用。人臉識別技術的基礎是人臉區域的識別和提取,難點在于人眼區域提取及鑒別,本文重點介紹人眼區域提取及鑒別程序實現。
【關鍵詞】人臉識別;感知識別技術;人眼區域
計算機識別是目前人工智能領域研究的重點,人臉識別是計算識別的重要內容之一,而人眼區域提取及鑒別人臉識別的難點,本文重點探討如何實現人眼區域提取及鑒別。
1.采用VC++設計人臉識別程序基本組成
人臉識別系統通過圖像采集系統捕捉圖像,然后通過計算相似度、二值化處理、垂直直方圖、水平直方圖、然后標記人臉區域,邊緣提取等步驟,才能實現人臉識別,過程是比較復雜的。因此,能否正確標記出人眼睛區域是人臉識別的難點。
2.人臉識別人眼睛區域提取
人眼睛區域提取具體算法比較復雜,需要確定人臉面部區后,才能正確提取。在人臉區域確定后,先進行邊緣檢測,確定左右兩個眼睛的水平區域,并統計計算眼睛區域個數。然后進行眼睛區域鑒別。眼睛區域鑒別算法是人眼區域提取的關鍵,具體程序算法如下:
//眼睛區域鑒別的關鍵算法VC程序。
CList
CList
int flag = 0;
CPoint tPoint(-1,-1);
for(i = 0; i { if(tempArray[i] > 0 && flag ==0) { tPoint.x = i; flag = 1; } if(tempArray[i] == 0 && flag ==1) { tPoint.y = i; myList1.AddTail(tPoint); flag = 0; } } delete tempArray; //去掉長度太小的候選者 for(i=0; i { CPoint temp(-1,-1); temp = myList1.GetAt(myList1.FindIndex(i)); int minVal = (m_rFaceRegion.right - m_rFaceRegion.left)/20; if((temp.y-temp.x)>=minVal) myList2.AddTail(temp); } myList1.RemoveAll(); //合并相鄰很緊的區域 bool quit = 1; while(quit) { bool doJoin = false; for(int i=0; i { CPoint temp1(-1,-1),temp2(-1,-1); temp1 = myList2.GetAt(myList2.FindIndex(i)); temp2 = myList2.GetAt(myList2.FindIndex(i+1)); if((temp2.x-temp1.y)<=(m_rFaceRegion.right - m_rFaceRegion.left)/40) { temp1.y = temp2.y; myList2.RemoveAt(myList2.FindIndex(i)); myList2.RemoveAt(myList2.FindIndex(i)); if(i == 0) yList2.AddHead(temp1); else myList2.InsertAfter(myList2.FindIndex(i-1),temp1); doJoin = true; break; } } if(!doJoin) quit = 0; } 通過人眼區域鑒別后,可能會出現沒有找到眼睛區域,或只捕捉到一只眼睛,或兩只眼睛捕捉完整,然后根據這三種情況分別處理,確認出兩個眼睛的水平區域。關于人眼垂直區域的確定,還有比較復雜的算法程序才能實現,限于篇幅,不再贅述。 3.實現測試 通過存儲在計算機中實際的圖片測試,人臉區域確定后,經過實際測試,能夠正確識別出人眼睛區域,如圖1所示,實驗證明,此種算法非常有效。 4.結論 通過多次試驗,該算法完全能夠正確提取出人眼睛區域,為人臉進一步識別做好準備。這種算法測試成功,由于C語言具有很好的可移植性,因此這種算法很容易移植到其它嵌入式設備中。 【參考文獻】 [1]、Visual C++ 6.0數字圖像處理 何斌、馬天予、王運堅、朱紅蓮. 2002。 [2]、Visual C++ 數字圖像與圖形處理,向世明 電子工業出版社 2002。