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;
}
}
}
效果
人脸检测:
眼睛检测:
嘴巴检测:
车牌检测: