在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征,下面详细介绍一下Haar特征。
OpenCV在人脸检测上使用的是haar特征的级联表,这个级联表中包含的是boost的分类器。
Haar分类器算法的要点如下:
① 使用Haar-like特征做检测。
② 使用积分图(Integral Image)对Haar-like特征求值进行加速。
③ 使用AdaBoost算法训练区分人脸和非人脸的强分类器。
④ 使用筛选式级联把强分类器级联到一起,提高准确率
下面是HAAR实现人脸检测和人眼睛的检测,将检测到人脸用方框圈出来,眼睛用圆圈圈出来。代码如下:
人脸检测:
<code>var mat_Gray = new Mat(); Cv2.CvtColor(mat_Src, mat_Gray, ColorConversionCodes.BGRA2GRAY); Cv2.EqualizeHist(mat_Gray, mat_Gray); var cascade = new CascadeClassifier(@"..\..\Data\haarcascade_frontalface_alt.xml"); var faces = cascade.DetectMultiScale( image: mat_Gray, scaleFactor: 1.1, minNeighbors: 2, flags: HaarDetectionType.DoRoughSearch | HaarDetectionType.ScaleImage, minSize: new OpenCvSharp.Size(30, 30) ); var rnd = new Random(); Mat mat_detectedFace = new Mat(); mat_Src.CopyTo(mat_detectedFace); foreach (var faceRect in faces) { var color = Scalar.FromRgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); Cv2.Rectangle(mat_detectedFace, faceRect, color, 3); } Bitmap bitmap_DetectedFace = mat_detectedFace.ToBitmap(); pictureBox2.Image = bitmap_DetectedFace;/<code>
2、眼睛检测
<code>var mat_Gray = new Mat(); Cv2.CvtColor(mat_Src, mat_Gray, ColorConversionCodes.BGRA2GRAY); Cv2.EqualizeHist(mat_Gray, mat_Gray); var cascade = new CascadeClassifier(@"..\..\Data\haarcascade_frontalface_alt.xml"); var nestedCascade = new CascadeClassifier(@"..\..\Data\haarcascade_eye_tree_eyeglasses.xml"); var detectedEyesGrayImage = new Mat(); var faces = cascade.DetectMultiScale( image: mat_Gray, scaleFactor: 1.1, minNeighbors: 2, flags: HaarDetectionType.DoRoughSearch | HaarDetectionType.ScaleImage, minSize: new OpenCvSharp.Size(30, 30) ); var rnd = new Random(); Mat mat_detectedEyes = new Mat(); mat_Src.CopyTo(mat_detectedEyes); foreach (var faceRect in faces) { var detectedEyesImage = new Mat(mat_Src, faceRect); Cv2.CvtColor(detectedEyesImage, detectedEyesGrayImage, ColorConversionCodes.BGRA2GRAY); var nestedObjects = nestedCascade.DetectMultiScale( image: detectedEyesGrayImage, scaleFactor: 1.1,//表示每次图像尺寸减小的比例 minNeighbors: 2, flags: HaarDetectionType.DoRoughSearch | HaarDetectionType.ScaleImage, minSize: new OpenCvSharp.Size(5, 5)//为目标的最小尺寸 ); foreach (var nestedObject in nestedObjects) { var color = Scalar.FromRgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); var center = new OpenCvSharp.Point { X = (int)(Math.Round(nestedObject.X + nestedObject.Width * 0.5, MidpointRounding.ToEven) + faceRect.Left), Y = (int)(Math.Round(nestedObject.Y + nestedObject.Height * 0.5, MidpointRounding.ToEven) + faceRect.Top) }; var radius = Math.Round((nestedObject.Width + nestedObject.Height) * 0.25, MidpointRounding.ToEven); Cv2.Circle(mat_detectedEyes, center, (int)radius, color, thickness: 3); } } Bitmap bitmap_detectedEyes = mat_detectedEyes.ToBitmap(); pictureBox3.Image = bitmap_detectedEyes;/<code>
3、预览
4、完整代码已上传,关注后私信回复:“面部检测”获取,感谢您的阅读和关注;