使用 OpenCV 进行人脸和眼睛检测






3.58/5 (38投票s)
本文演示了如何在 .NET 中使用 OpenCV 对图像执行人脸和眼睛检测。

引言
本文是一篇文章的扩展,我之前在 CodeProject 上发布过。 此项目演示了如何在 .NET 中使用 OpenCV 执行人脸和眼睛检测。 检测是使用我从两个不同来源获取的 Haar 级联执行的(参见参考资料)。
背景
在从事人脸识别项目时,我偶然发现了一个巨大的问题;预处理阶段需要人脸对齐才能获得更好的结果。 此步骤需要眼睛坐标,以便在执行实际的人脸识别训练/投影之前将图像拉伸/旋转到标准尺寸。 对于实验,可以手动输入眼睛坐标,但这永远不会是实用的解决方案。 在探索我的选择时,我找到了 OpenCV 和 Haar 级联来为我执行此任务。
Using the Code
该项目主要是一个托管的 VC++.NET 类库,可以从 C#/VC++ .NET 中使用。 一个测试应用程序演示了此库的典型用法。 需要注意的是,Version 2 需要当前执行路径文件夹中的“Cascades”文件夹。
主要使用两个函数来执行人脸和眼睛检测。 观察以下代码
// the variable faces contains the number of detected faces in the image
int faces = objFaceDetector.WrapDetectFaces(lastPic);
int lx, ly, rx, ry, res;
for(int f = 0; f < faces; f++)
{
//The face coordinates are indexed, max index == 4
objFaceDetector.WrapGetFaceCordinates(f, &lx, &ly, &rx, &ry);
<< Source Code For Drawing Face Rectangle >>
//returns -1 if cannot detect eyes for this face index
res = objFaceDetector.WrapGetEyeCordinates(f, &lx, &ly, &rx, &ry);
<< Source Code For Drawing Eye Crosses >>
}
这个库的使用非常简单,可以在人脸识别和人机交互项目中找到它的应用。 有人建议使用它来检测驾驶员是否在驾驶时打瞌睡,但请让我提醒您,我对该代码的结果不作任何保证,Opencv、Opencv 开发人员社区或任何其他方也不作保证。 作者不对因以任何方式使用此代码而直接或间接造成的任何损害、伤害和/或损失负责。
关注点
通过编写一段代码片段进一步校正了眼睛级联的准确性,该代码片段只是检查建议的眼睛坐标是否真的落在脸部区域内。 此外,人脸区域在逻辑上分为四个等高的水平条,从顶部数第二个条包含眼睛。 该条可以垂直分成两半,以便每只眼睛都落在其中一半。 如果检测到的眼睛坐标未落在各自的一半中,则会被丢弃。 如果同一区域内有多个检测结果,由于经验原因,首选尺寸较小的对象。 使用两个不同的级联执行眼睛检测,这证明比使用声称可以一次检测两只眼睛的级联效果更好。 进一步的研究可能会导致您不同于我建议的方法,您可以随时提供反馈。
参考文献
- OpenCV [http://opencvlibrary.sourceforge.net/FaceDetection]
- Modesto Castrillón Santana(OpenCV 开发者社区)提供的眼睛检测级联
此作者的其他文章
- 托管 PNM 阅读器和写入器 [https://codeproject.org.cn/KB/cs/Managed_PGM.aspx]
- 智能屏幕保护程序 [https://codeproject.org.cn//KB/mcpp/iss.aspx]