文章目录

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;
        }

    }
}

效果

人脸检测:


眼睛检测:

嘴巴检测:

车牌检测: