///////////////////////////////////////////////////////////////////////////////////// public faceDetection facedetection(Mat image, CascadeClassifier cascade) { faceDetection face = new faceDetection(); Mat tmp = new Mat(); image.CopyTo(tmp); Mat grayImage = new Mat(); List <Rectangle> faces = new List <Rectangle>(); CvInvoke.CvtColor(tmp, grayImage, ColorConversion.Bgr2Gray); CvInvoke.EqualizeHist(grayImage, grayImage); // 均衡化 Rectangle[] facedetected = cascade.DetectMultiScale(grayImage, 1.1, 3, new Size(80, 80)); faces.AddRange(facedetected); int rect_x, rect_y, rect_width, rect_height; if (faces.Count > 0) { rect_x = faces[0].X; rect_y = faces[0].Y; rect_width = faces[0].Width; rect_height = faces[0].Height; CvInvoke.Rectangle(tmp, faces[0], new Bgr(Color.Red).MCvScalar, 1); face.faceRoi = new Mat(image, faces[0]); face.coor_x = rect_x; face.coor_y = rect_y; face.srcImage = tmp; face.FLAG = true; return(face); } else { face.srcImage = tmp; face.FLAG = false; return(face); } }
public Mat process(Mat image, bool flag) { // 人脸检测 START... flag = glassCheckBox.Checked ? false : true; faceDetection face = new faceDetection(); face = facedetection(image, cascadeFace); faceFLAG = face.FLAG; faceRectImage = face.srcImage; faceROI = face.faceRoi; coor_x = face.coor_x; coor_y = face.coor_y; // 人脸检测 END... // 眼睛检测 START... if (faceFLAG) { if (flag) // 不戴眼镜 { eyeDetection eye = eyedetection(faceROI, cascadeEye, faceRectImage, coor_x, coor_y); resShowImage = eye.faceImage; eyeROI = eye.eyeRoi; eyeFLAG = eye.FLAG; } else // 戴眼镜 { eyeDetection eye = eyedetection(faceROI, cascadeEyeWithGlasses, faceRectImage, coor_x, coor_y); resShowImage = eye.faceImage; eyeROI = eye.eyeRoi; eyeFLAG = eye.FLAG; } // 眼睛检测 END... // 椭圆拟合 START... if (eyeFLAG) // 检测到眼睛 { CvInvoke.Resize(eyeROI, eyeROI, new Size(24, 24)); EllipseEye e = eyeEllipse(eyeROI); if (e.FLAG) // 椭圆拟合完成 { eyeOpenDegree = e.width / e.height; if (eye.Count == 20) { //eye.ToArray(); eye.Reverse(); eye.RemoveAt(19); eye.Reverse(); } eye.Add(eyeOpenDegree); } else // 椭圆拟合未完成 { eyeOpenDegree = 0.1F; if (eye.Count == 20) { //eye.ToArray(); eye.Reverse(); eye.RemoveAt(19); eye.Reverse(); } eye.Add(eyeOpenDegree); } } else // 未检测到眼睛 { eyeOpenDegree = 0.1F; if (eye.Count == 20) { //eye.ToArray(); eye.Reverse(); eye.RemoveAt(19); eye.Reverse(); } eye.Add(eyeOpenDegree); } } else // 未检测到人脸 { nHeadPosture++; } return(resShowImage); }