【EmguCv】人脸/人眼检测
2017-10-13 16:26
239 查看
目录:
获取脸部和眼部图像的接口定义IFacecs
IFaces接口实现FaceImplcs
CascadeClassifierDetectMultiScale参数
分类文件
检测截图
获取脸部和眼部图像的接口定义IFacecs
IFaces接口实现FaceImplcs
CascadeClassifierDetectMultiScale参数
分类文件
检测截图
1. 获取脸部和眼部图像的接口定义(IFace.cs)
using Emgu.CV; using Emgu.CV.Structure; using System.Collections.Generic; public interface IFace { /// <summary> /// 获取脸部图像 /// </summary> /// <param name="img">原始图像</param> /// <returns>脸部图像集合</returns> List<Image<Bgr, byte>> GetFaceImgList(Image<Bgr, byte> img); /// <summary> /// 获取眼睛图像 /// </summary> /// <param name="img">脸部图像</param> /// <returns>眼睛图像集合</returns> List<Image<Bgr, byte>> GetEyeImgList(Image<Bgr, byte> faceimg); }
2. IFaces接口实现(FaceImpl.cs)
using Emgu.CV; using Emgu.CV.Structure; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace FaceRecognition { public class FaceImpl : IFace { private CascadeClassifier faceClassifier; private CascadeClassifier eyeClassifier; public string log; public void LoadFaceRecognitionFile(string file) { try { faceClassifier = new CascadeClassifier(file); log = "识别文件载入成功"; } catch(Exception ex) { MessageBox.Show("识别文件载入失败,详细原因\n"+ex.Message); } } public void LoadEyeRecognitionFile(string file) { try { eyeClassifier = new CascadeClassifier(file); } catch (Exception ex) { MessageBox.Show("识别文件载入失败,详细原因\n" + ex.Message+"\n"+ex.StackTrace); } } public List<Image<Bgr,byte>> GetFaceImgList( Image<Bgr,byte> img) { List<Image<Bgr, byte>> facelist = new List<Image<Bgr, byte>>(); Rectangle[] faces = faceClassifier.DetectMultiScale(img,1.3, 3, new Size(40, 40)); try { log = "检测中"; foreach (Rectangle face in faces) { CvInvoke.Rectangle(img, face, new Bgr(Color.Red).MCvScalar, 2); CvInvoke.cvSetImageROI(img, face); Image<Bgr, byte> roi = new Image<Bgr, byte>(face.Size); CvInvoke.cvCopy(img, roi, IntPtr.Zero); facelist.Add(roi); } if (facelist.Count != 0) return facelist; else { facelist.Add(img); return facelist; } } catch(Exception ex) { MessageBox.Show("脸部检测失败,详细原因\n" + ex.Message + "\n" + ex.StackTrace); facelist.Add(img); return facelist; } } public List<Image<Bgr, byte>> GetEyeImgList(Image<Bgr, byte> faceimg) { List<Image<Bgr, byte>> eyelist = new List<Image<Bgr, byte>>(); Rectangle[] eyes = eyeClassifier.DetectMultiScale(faceimg, 1.3, 3, new Size(20, 20)); try { log = "检测中"; foreach (Rectangle eye in eyes) { CvInvoke.Rectangle(faceimg, eye, new Bgr(Color.Green).MCvScalar, 2); CvInvoke.cvSetImageROI(faceimg, eye); Image<Bgr, byte> roi = new Image<Bgr, byte>(eye.Size); CvInvoke.cvCopy(faceimg, roi, IntPtr.Zero); eyelist.Add(roi); } 4000 if (eyelist.Count == 0) { eyelist.Add(faceimg); eyelist.Add(faceimg); return eyelist; } else if (eyelist.Count == 1) { eyelist.Add(faceimg); return eyelist; } else return eyelist; } catch (Exception ex) { MessageBox.Show("眼部检测检测失败,详细原因\n" + ex.Message + "\n" + ex.StackTrace); eyelist.Add(faceimg); return eyelist; } } } }
3. CascadeClassifier.DetectMultiScale参数
public Rectangle[] DetectMultiScale( IInputArray image, double scaleFactor = 1.1, int minNeighbors = 3, Size minSize = default(Size), Size maxSize = default(Size) );
参数1:image--待检测图片,一般为灰度图像加快检测速度; 参数2:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%; 参数3:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。 如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框, 这种设定值一般用在用户自定义对检测结果的组合程序上; 参数4、5:minSize和maxSize用来限制得到的目标区域的范围。
4. 分类文件
haarcascade_frontalface_default.xml检测人脸
haarcascade_eye检测人眼
5. 检测截图
相关文章推荐
- opencv 利用类haar小波特征的人脸、人眼等特征检测(带代码)
- QT5+OpenCV人脸、人眼检测
- SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序
- opencv-摄像头人脸人眼实时检测
- c#下使用EmguCV操作摄像头和最简单的人脸检测
- C#结合emgucv进行人脸检测
- 图片人脸检测 (I)【sample改版 人眼检测】
- 用 C# 做人脸检测(EmguCV)
- 用 C# 做人脸检测(基于EmguCV)
- 图片人脸检测 (I)【sample改版 人眼检测】
- 用 C# 做人脸检测(基于EmguCV)
- 【EMGU】人脸防伪:人脸人眼检测定位
- 级联分级器目标检测objdect(人脸和人眼的检测)
- opencv2实现人脸及人眼检测_相当稳定
- 基于opencv和QT的人脸(人眼)检测程序
- opencv 检测人脸、人眼
- 用摄像头进行人脸和人眼实时检测的优化 算法
- 基于opencv的疲劳驾驶检测中人脸和人眼的检测
- Java使用OpenCV实现人脸识别/人眼检测/图片截取/合成/添加水印
- 用 C# 做人脸检测(EmguCV)