zoukankan      html  css  js  c++  java
  • 【EmguCv】人脸/人眼检测

    目录:

    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("识别文件载入失败,详细原因
    "+ex.Message);
        }
        }
        public void LoadEyeRecognitionFile(string file)
        {
        try
        {
        eyeClassifier = new CascadeClassifier(file);
    
        }
        catch (Exception ex)
        {
        MessageBox.Show("识别文件载入失败,详细原因
    " + ex.Message+"
    "+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("脸部检测失败,详细原因
    " + ex.Message + "
    " + 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);
        }
        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("眼部检测检测失败,详细原因
    " + ex.Message + "
    " + 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. 检测截图

  • 相关阅读:
    值类型引用类型的区别(转)
    聚集索引和非聚集索引(转)
    使用docker安装nginx并配置端口转发
    jenkins选择分支构建
    创建好docker后不能apt-get update解决方法
    Docker开启Remote API 访问 2375端口
    Docker加速配置
    Docker下载安装
    进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题
    定时删除日志文件---linux定时清理日志
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286773.html
Copyright © 2011-2022 走看看