项目需求:某市级组织考试,在考试前需审核考生采集表中的考生照片是否合格,由于要审核的考生信息采集表有很多,原先进行的是手动人工审核,比较费时费力,审核的要求也很简单,并不判断考生是否是图片本人(身份验证有另外一套程序来进行),只是看考生采集表中考生头像是否是人脸(是否存在辨识不清楚,不是人脸)。因此提出需求,看是否能用程序来检测考生信息采集表中的照片,只需找出来疑似不是人脸的考生所在文档位置(pdf文档)即可,存疑的考生再由人工进行审核。
PDF文档中有很多页,每一页都是如图中的结构。
经过百度摸索,采用了C#+WPF+Spire.PDF+Emgu CV+MvvmLight来进行人脸判断的技术选型。
Emgu CV(https://sourceforge.net/projects/emgucv/files/emgucv/)是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的
OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。Emgu CV官方带的有训练过的人脸识别模板,可以直接使用。
Spire.PDF可以来读取PDF文档,同时可以读取到PDF文档中的图片。
MvvmLight是WPF可以使用的一种MVVM模式的实现框架。
项目技术选型确定以后,下面就是代码的编写。
项目引用Emgu CV、Spire.PDF、MvvmLight
从官网下载Emgu CV后,我们把它项目中的haarcascade_eye.xml、haarcascade_frontalface_alt.xml两个训练过的人脸识别模板放到bin/debug下,供Emgu CV使用时调用。
引用MvvmLight后,会自动在项目中创建ViewModel目录,我们在此目录中新建一个Pdf2FaceInfoModel.cs类,用来做为检测结果的通知类。
using System.ComponentModel;
namespace Pdf2Face.ViewModel
{
public class Pdf2FaceInfoModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string pdfName { get; set; }
///
/// Pdf文件名
///
public string PdfName
{
get => pdfName;
set
{
pdfName = value;
PropertyChanged?.Invoke(this,new PropertyC