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、完整代碼已上傳,關注後私信回覆:“面部檢測”獲取,感謝您的閱讀和關注;


分享到:


相關文章: