37-简单人脸检测实例(EmguCV学习)

文章目录

Record

1、人脸检测:找出图像中人脸的位置;;人脸识别:根据人脸区域识别出人的姓名或其他标识,主要是机器学习方面的内容;
2、这里使用Harr特征检测器对人脸进行检测(简单跑了下程序):
在这里插入图片描述
在这里插入图片描述
3、Harr分类器原理简述:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、参考:https://www.cnblogs.com/ello/archive/2012/04/28/2475419.html

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using Emgu.Util;
using System.Drawing;

namespace lesson37
{
    class Program
    {
        static void Main(string[] args)
        {
            //图片人脸检测
            //CascadeClassifier face_cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml"); //加载训练好的级联分类器
            //Mat faceImg = CvInvoke.Imread("./pics/2.jpg");
            //Mat gray = new Mat();
            //CvInvoke.CvtColor(faceImg, gray, ColorConversion.Bgr2Gray);
            CvInvoke.EqualizeHist(gray, gray);  //直方图均衡化避免亮度过亮或者过暗
            调用函数进行人脸检测
            //Rectangle[] faceDetect = face_cascade.DetectMultiScale(gray, 1.1, 2, new Size(50, 50));
            //foreach (var i in faceDetect)
            //{
            //    //矩形标注
            //    CvInvoke.Rectangle(faceImg, i, new MCvScalar(255, 0, 0), 2);
            //}
            //if(faceDetect.Length < 2)
            //{
            //    string strFaceNum = string.Format("That is {0} face!", faceDetect.Length);
            //    CvInvoke.PutText(faceImg, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 0, 255), 1);
            //}
            //else
            //{
            //    string strFaceNum = string.Format("There are {0} face!", faceDetect.Length);
            //    CvInvoke.PutText(faceImg, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 0, 255), 1);
            //}
            //CvInvoke.Imshow("FaceDetect", faceImg);
            //CvInvoke.WaitKey(0);

            ///视频检测人脸
            //VideoCapture cap = new VideoCapture("test.mp4");
            //if (!cap.IsOpened)
            //{
            //    Console.WriteLine("open the video failed..");
            //    return;
            //}
            //Mat frame = new Mat();
            //while (true)
            //{
            //    cap.Read(frame);
            //    if (frame.IsEmpty)
            //    {
            //        Console.WriteLine("frame is empty..");
            //        break;
            //    }
            //    Mat result = FaceDetectFunc(frame);
            //    CvInvoke.Resize(result, result, new Size(640, 480));
            //    CvInvoke.Imshow("result", result);
            //    if (CvInvoke.WaitKey(30) == 27)
            //    {
            //        break;
            //    }
            //}

            ///人眼检测
            //CascadeClassifier face_cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml");//加载人脸训练模型
            //CascadeClassifier eye_cascade = new CascadeClassifier("haarcascade_eye.xml"); //加载眼睛训练模型
            加载原图像
            //Mat src = CvInvoke.Imread("./pics/6.jpg");
            转换灰度图
            //Mat gray = new Mat();
            //CvInvoke.CvtColor(src, gray, ColorConversion.Bgr2Gray);
            人脸检测
            //Rectangle[] faceDetect = face_cascade.DetectMultiScale(gray, 1.1, 2, new Size(50, 50));            
            //foreach (var i in faceDetect)
            //{
            //    //圈出人脸
            //    CvInvoke.Rectangle(src, i, new MCvScalar(0, 255, 0), 2);
            //    //眼睛识别
            //    Mat eyeImg = new Mat(gray, i);
            //    Rectangle[] eyeDetect = eye_cascade.DetectMultiScale(eyeImg, 1.1, 2, new Size(20, 20));
            //    //圈出眼睛
            //    foreach (var j in eyeDetect)
            //    {
            //        //CvInvoke.Rectangle(src, j, new MCvScalar(255, 0, 0), 2);
            //        //!!!注意这里必须重新计算矩形的位置
            //        CvInvoke.Rectangle(src, new Rectangle(i.X + j.X, i.Y + j.Y, j.Width, j.Height),new MCvScalar(255,0,0),2);
            //    }
            //}
            //if(faceDetect.Length < 2)
            //{
            //    string strFaceNum = string.Format("That is {0} face!", faceDetect.Length);
            //    CvInvoke.PutText(src, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 255, 0), 2);
            //}
            //else
            //{
            //    string strFaceNum = string.Format("There are {0} face!", faceDetect.Length);
            //    CvInvoke.PutText(src, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 255, 0), 2);
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///嘴巴检测(微笑检测)
            //CascadeClassifier face_cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml");//加载人脸训练模型
            //CascadeClassifier smile_cascade = new CascadeClassifier("haarcascade_smile.xml"); //加载眼睛训练模型
            加载原图像
            //Mat src = CvInvoke.Imread("./pics/11.jpg");
            转换灰度图
            //Mat gray = new Mat();
            //CvInvoke.CvtColor(src, gray, ColorConversion.Bgr2Gray);
            人脸检测
            //Rectangle[] faceDetect = face_cascade.DetectMultiScale(gray, 1.1, 2, new Size(50, 50));
            //foreach (var i in faceDetect)
            //{
            //    //圈出人脸
            //    CvInvoke.Rectangle(src, i, new MCvScalar(0, 255, 0), 2);
            //    //眼睛识别
            //    Mat eyeImg = new Mat(gray, i);
            //    Rectangle[] smileDetect = smile_cascade.DetectMultiScale(eyeImg, 1.1, 2, new Size(20, 20));
            //    //圈出眼睛
            //    foreach (var j in smileDetect)
            //    {
            //        //CvInvoke.Rectangle(src, j, new MCvScalar(255, 0, 0), 2);
            //        //!!!注意这里必须重新计算矩形的位置
            //        CvInvoke.Rectangle(src, new Rectangle(i.X + j.X, i.Y + j.Y, j.Width, j.Height), new MCvScalar(255, 0, 0), 2);
            //    }
            //}
            //if (faceDetect.Length < 2)
            //{
            //    string strFaceNum = string.Format("That is {0} face!", faceDetect.Length);
            //    CvInvoke.PutText(src, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 255, 0), 2);
            //}
            //else
            //{
            //    string strFaceNum = string.Format("There are {0} face!", faceDetect.Length);
            //    CvInvoke.PutText(src, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 255, 0), 2);
            //}
            //CvInvoke.Imshow("result", src);
            //CvInvoke.WaitKey(0);

            ///车牌区域检测
            CascadeClassifier plate_cascade = new CascadeClassifier("haarcascade_russian_plate_number.xml"); //加载车牌分类器
            Mat plateImg = CvInvoke.Imread("./plates/3.jpg");//加载车牌图像
            Mat gray = new Mat();
            CvInvoke.CvtColor(plateImg, gray, ColorConversion.Bgr2Gray);
            //CvInvoke.EqualizeHist(gray, gray);  //直方图均衡化,优化图像亮度
            //车牌检测
            Rectangle[] plateDetect = plate_cascade.DetectMultiScale(gray, 1.1, 2, new Size(50, 50));
            foreach (var i in plateDetect)
            {
                CvInvoke.Rectangle(plateImg, i, new MCvScalar(255, 0, 0), 2);
            }
            if(plateDetect.Length < 2)
            {
                string strplateNum = string.Format("There is {0} plate!", plateDetect.Length);
                CvInvoke.PutText(plateImg, strplateNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 0, 255), 2);
            }
            else
            {
                string strplateNum = string.Format("There are {0} plate!", plateDetect.Length);
                CvInvoke.PutText(plateImg, strplateNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 0, 255), 2);
            }
            CvInvoke.Imshow("result", plateImg);

            CvInvoke.WaitKey(0);
        }

        static Mat FaceDetectFunc(Mat frame)
        {
            Mat result = frame.Clone();

            //加载训练模型,初始化级联分类器
            CascadeClassifier face_cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml");
            Mat gray = new Mat();          
            CvInvoke.CvtColor(frame, gray, ColorConversion.Bgr2Gray);
            //人脸检测
            Rectangle[] faceDetect = face_cascade.DetectMultiScale(gray, 1.1, 2, new Size(200, 200));
            foreach (var i in faceDetect)
            {
                CvInvoke.Rectangle(result, i, new MCvScalar(0, 255, 0), 2);
            }
            if(faceDetect.Length <2)
            {
                string strFaceNum = string.Format("That is {0} face!", faceDetect.Length);
                CvInvoke.PutText(result, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 0, 255), 2);
            }
            else
            {
                string strFaceNum = string.Format("There are {0} face!", faceDetect.Length);
                CvInvoke.PutText(result, strFaceNum, new Point(10, 20), FontFace.HersheyComplex, 0.8, new MCvScalar(0, 0, 255), 2);
            }
            return result;
        }

    }
}

效果

人脸检测:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

眼睛检测:

在这里插入图片描述

在这里插入图片描述

嘴巴检测:

在这里插入图片描述

车牌检测:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值