人脸识别人眼区域提取鉴别
2019-08-16蔡宗吟罗国平
蔡宗吟 罗国平
【摘 要】人脸识别技术在人工智能、机器识别、机器学习等领域具有广泛的应用。人脸识别技术的基础是人脸区域的识别和提取,难点在于人眼区域提取及鉴别,本文重点介绍人眼区域提取及鉴别程序实现。
【关键词】人脸识别;感知识别技术;人眼区域
计算机识别是目前人工智能领域研究的重点,人脸识别是计算识别的重要内容之一,而人眼区域提取及鉴别人脸识别的难点,本文重点探讨如何实现人眼区域提取及鉴别。
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。