OpenCVSharp学习之——人脸及眼睛检测

在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、预览

OpenCVSharp学习之——人脸及眼睛检测

4、完整代码已上传,关注后私信回复:“面部检测”获取,感谢您的阅读和关注;


分享到:


相關文章: