Emgu cv人臉檢測識別
1、開發平台:WIN10 X64 VS2012 Emgucv版本:3.1
2、先給大家分享一個官網給的示例源代碼:
https://ncu.dl.sourceforge.net/project/emgufacerecog/Face%20Recognition%202.4.9.zip
3、部分代碼展示:
【打開攝像頭:】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基於人臉識別的智能監控 { class CaptureManage { private Emgu.CV.Capture capture;//攝像頭對象 //檢測是否有可用攝像頭 void showCapture() { } public Object returnCapture(int a) { switch(a) { case 1://本地攝像頭 try { capture = new Emgu.CV.Capture(); capture.Start();//攝像頭開始工作 return capture; } catch { } break; case 2: //網絡攝像頭 try { capture = new Emgu.CV.Capture("rtsp://admin:tlJwpbo6@192.168.1.125:554"); } catch (NullReferenceException excpt) { //MessageBox.Show("攝像頭打開失敗\n" + excpt.Message); } break; case 3: break; } return null; } private bool closeCapture(int i) { switch (i) { case 1://本地攝像頭 try { if(capture!=null) capture.Stop();//攝像頭開始工作 return true; } catch { } break; case 2: //網絡攝像頭 break; case 3: break; } return false; } } }
【實時獲取圖像】 CaptureManage cm = new CaptureManage(); //capture = new Emgu.CV.Capture(); //capture.Start();//攝像頭開始工作 capture = (Emgu.CV.Capture)cm.returnCapture(1); capture.ImageGrabbed += frameProcess;//實時獲取圖像
【加載和人臉識別有關的XML】 //faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml"); faceClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml"); SetTrainedFaceRecognizer(FaceRecognizerType.EigenFaceRecognizer);//設置識別器
【訓練人臉識別器】
public TrainedFaceRecognizer SetTrainedFaceRecognizer(FaceRecognizerType type) { tfr = new TrainedFaceRecognizer(); tfr.trainedFileList = SetSampleFacesList(); switch (type) { case FaceRecognizerType.EigenFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.EigenFaceRecognizer(80, double.PositiveInfinity);//PositiveInfinity double.NegativeInfinity break; case FaceRecognizerType.FisherFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.FisherFaceRecognizer(0, 3500); break; case FaceRecognizerType.LBPHFaceRecognizer: tfr.faceRecognizer = new Emgu.CV.Face.LBPHFaceRecognizer(1, 8, 8, 8, 100); break; } tfr.faceRecognizer.Train(tfr.trainedFileList.trainedImages.ToArray(), tfr.trainedFileList.trainedLabelOrder.ToArray()); return tfr; }
【識別出人臉矩形框】 public faceDetectedObj GetFaceRectangle(Mat emguImage) { faceDetectedObj fdo = new faceDetectedObj(); fdo.originalImg = emguImage; List<Rectangle> faces = new List<Rectangle>(); //List<Rectangle> eyes = new List<Rectangle>(); try { using (UMat ugray = new UMat()) { CvInvoke.CvtColor(emguImage, ugray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);//灰度化圖片 CvInvoke.EqualizeHist(ugray, ugray);//均衡化灰度圖片 Rectangle[] facesDetected = faceClassifier.DetectMultiScale(ugray, 1.1, 10, new Size(20, 20)); //Rectangle[] eyesDetected = eyesClassifier.DetectMultiScale(ugray, 1.1, 3, new Size(100, 100)); faces.AddRange(facesDetected); //向list集合的末尾添加 //eyes.AddRange(eyesDetected); } } catch (Exception ex) { ex.ToString(); } fdo.facesRectangle = faces; return fdo; }
【給識別出的所有人臉畫圈】 public faceDetectedObj faceRecognize(Mat emguImage) { faceDetectedObj fdo; try { fdo = GetFaceRectangle(emguImage); Image<Gray, byte> tempImg = fdo.originalImg.ToImage<Gray, byte>(); using (Graphics g = Graphics.FromImage(fdo.originalImg.Bitmap)) { // camoareTwoImage(Emgu.CV.Image<Bgr,byte>[] img1,Emgu.CV.Image<Bgr,byte> img2); // camoareTwoImage(fdo.facesRectangle,emguImage.ToImage<Bgr,byte>); foreach (Rectangle face in fdo.facesRectangle) { g.DrawArc(new Pen(Color.Blue, 2), face,0,360);//畫圓 Image<Gray, byte> GrayFace = tempImg.Copy(face).Resize(100, 100, Emgu.CV.CvEnum.Inter.Cubic); GrayFace._EqualizeHist();//得到均衡化人臉的灰度圖像 Emgu.CV.Face.FaceRecognizer.PredictionResult pr = tfr.faceRecognizer.Predict(GrayFace);//返回預測圖像的標簽 double db = pr.Distance;//.CompareTo(pr.Distance);//返回相似度 string recogniseName = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); //FaceRecognizer string name = tfr.trainedFileList.trainedFileName[pr.Label].ToString(); //pr.GetType(); if (db >5690 || pr.Label == -1) { name = "不認識"; } //畫出姓名 //camoareTwoImage(GrayFace.MIplImage<Bgr,byte>, fdo.originalImg.ToImage<Bgr, byte>); else { Font font = new Font("楷體", 16, GraphicsUnit.Pixel); SolidBrush fontLine = new SolidBrush(Color.Red); float xPos = face.X + (face.Width / 2 - (name.Length * 14) / 2); float yPos = face.Y - 21; g.DrawString(name + "_" + pr.Label + "[" + db + "]", font, fontLine, xPos, yPos); //MessageBox.Show("返回的Pr為:"+db); //Console.WriteLine("db的值為==》》》》"+db); } fdo.names.Add(name); } } } finally { //emguImage.Dispose(); } return fdo; }
4、識別效果見下圖:
5、以上代碼並非全部是我敲的,參照【http://blog.csdn.net/u011616825/article/details/51620061】。