///////////////////////////////////////////////////////////////////////////////////////// public eyeDetection eyedetection(Mat image, CascadeClassifier cascade, Mat faceRectImage, int coor_x, int coor_y) { eyeDetection eye = new eyeDetection(); Mat tmp = new Mat(); image.CopyTo(tmp); Mat grayImage = new Mat(); List <Rectangle> eyes = new List <Rectangle>(); CvInvoke.CvtColor(tmp, grayImage, ColorConversion.Bgr2Gray); CvInvoke.EqualizeHist(grayImage, grayImage); // 均衡化 Rectangle[] eyedetected = cascade.DetectMultiScale(grayImage, 1.1, 3, new Size(20, 20)); eyes.AddRange(eyedetected); int rect_x, rect_y, rect_width, rect_height; if (eyes.Count > 0) { rect_x = eyes[0].X; rect_y = eyes[0].Y; rect_width = eyes[0].Width; rect_height = eyes[0].Height; CvInvoke.Rectangle(faceRectImage, new Rectangle(rect_x + coor_x, rect_y + coor_y, rect_width, rect_height), new Bgr(Color.Blue).MCvScalar, 1); eye.eyeRoi = new Mat(image, eyes[0]); eye.faceImage = faceRectImage; eye.FLAG = true; return(eye); } else { eye.faceImage = faceRectImage; eye.FLAG = false; return(eye); } }
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); }