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、預覽

4、完整代碼已上傳,關注後私信回覆:“面部檢測”獲取,感謝您的閱讀和關注;