.Net AI学习笔记系列
第八章 OpenCVSharp实操——剪切人脸头像
前言
本文主要介绍使用CascadeClassifier类读取haarcascade_frontalface_default.xml文件,建立人脸检测的对象,然后再使用人脸检测的对象的方法——DetectMultiScale进行人脸数量识别。
一、OpenCVSharp实操——剪切人脸头像
二、步骤
1.开发工具
VS2019+.net 4.8+OpenCvSharp4
2.引入库
Install-Package OpenCvSharp4
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;
3.示例代码
代码如下(示例):
//人脸检测并剪切
private void button1_Click(object sender, EventArgs e)
{
// 加载人脸检测级联分类器
var faceCascade = new CascadeClassifier(@"Models//haarcascade_frontalface_default.xml");
//加载图像
Mat srcSigleWoman = BitmapConverter.ToMat((Bitmap)this.pictureBox1.Image);
Mat srcMoreMans= BitmapConverter.ToMat((Bitmap)this.pictureBox2.Image);
//灰度化
Mat graySigleWoman = new Mat();
Mat grayMoreMans = new Mat();
Cv2.CvtColor(srcSigleWoman, graySigleWoman,ColorConversionCodes.BGR2GRAY);
Cv2.CvtColor(srcMoreMans, grayMoreMans,ColorConversionCodes.BGR2GRAY);
// 设置人脸检测参数
int minNeighbors = 5;
var minSize = new OpenCvSharp.Size(100, 100);
// 检测图像中的人脸
Mat croppedImage = new Mat();
var faces = faceCascade.DetectMultiScale(graySigleWoman, 1.1, minNeighbors, HaarDetectionTypes.DoCannyPruning, minSize);
foreach (var face in faces)
{
Cv2.Rectangle(srcSigleWoman, face, Scalar.Red, 5);
// 使用 SubMat 方法剪切图像
croppedImage = srcSigleWoman.SubMat(face);
this.pictureBox3.Image = BitmapConverter.ToBitmap(croppedImage);
this.pictureBox3.Refresh();
}
//多头像
int index = 0;
minSize = new OpenCvSharp.Size(30, 30);
var facesMore = faceCascade.DetectMultiScale(grayMoreMans, 1.1, minNeighbors, HaarDetectionTypes.DoCannyPruning, minSize);
foreach (var face in facesMore)
{
Cv2.Rectangle(srcMoreMans, face, Scalar.Red, 2);
// 使用 SubMat 方法剪切图像
croppedImage = srcMoreMans.SubMat(face);
PictureBox picBox = (PictureBox)panel1.Controls[index];
picBox.Image= BitmapConverter.ToBitmap(croppedImage);
picBox.Refresh();
index++;
//Thread.Sleep(1000);
}
//显示
this.pictureBox1.Image = BitmapConverter.ToBitmap(srcSigleWoman);
this.pictureBox1.Refresh();
this.pictureBox2.Image = BitmapConverter.ToBitmap(srcMoreMans);
this.pictureBox2.Refresh();
}
4.运行效果
总结
hascadeClassifier 是 OpenCV(Open Source Computer Vision Library)中的一个类,用于实现基于级联分类器的目标检测任务,如人脸检测、眼睛检测等。级联分类器是一种由多个弱分类器组成的强分类器,它通过级联的方式逐步排除负样本,从而提高检测速度和准确性。