头像裁剪有利于人脸识别批量照片预处理,安防领域可以快速通过视频定位人脸,进行抓拍,做人脸识别相关功能的可能会应用到人脸裁剪,以下是我在实践中应用的代码,如有需要复制粘贴即可使用。

using Emgu.CV;
using Emgu.CV.Structure;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq; namespace CutFace
{
class Program
{
static void Main(string[] args)
{
FaceClassifier = InitFaceClassifier();
CutFace($@"{RootPath}\images", $@"{RootPath}\faceimages");
} /// <summary>
/// 根路径
/// </summary>
public static string RootPath = AppDomain.CurrentDomain.BaseDirectory; /// <summary>
/// 人脸级联分类器
/// </summary>
public static CascadeClassifier FaceClassifier { get; set; } /// <summary>
/// 初始化人脸级联分类器
/// </summary>
public static CascadeClassifier InitFaceClassifier()
{
//判断opencv相关文件是否存在,不存在根据系统类型创建相关文件
if (!File.Exists($@"{RootPath}\cvextern.dll"))
{
var dir = $@"{RootPath}\opencv"; string zip = Directory.GetFiles(dir).Where(m => Environment.Is64BitProcess ? m.Contains("x64.zip") : m.Contains("x86.zip")).FirstOrDefault();
if (!string.IsNullOrEmpty(zip))
{
//将压缩包解压到根目录
new FastZip().ExtractZip(zip, RootPath, null);
}
} //如果支持用显卡,则用显卡运算
CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice; //构建级联分类器,利用已经训练好的数据,识别人脸
return new CascadeClassifier($@"{RootPath}\opencv\haarcascade_frontalface_alt.xml");
} /// <summary>
/// 裁剪人脸
/// </summary>
/// <param name="srcPath">源路径</param>
/// <param name="outPath">输出路径</param>
public static void CutFace(string srcPath, string outPath)
{
if (!Directory.Exists(outPath))
{
Directory.CreateDirectory(outPath);
} var files = Directory.GetFiles(srcPath); int fcount = 0; foreach (var f in files)
{
//加载要识别的图片
using (var img = new Image<Bgr, byte>(f))
{
using (var img2 = img.Clone())
{
//把图片从彩色转灰度
CvInvoke.CvtColor(img, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); //亮度增强
CvInvoke.EqualizeHist(img2, img2); //在这一步就已经识别出来了,返回的是人脸所在的位置和大小
var facesDetected = FaceClassifier.DetectMultiScale(img2, 1.1, 10, new Size(100, 100)); //循环把人脸部分切出来并保存
foreach (var item in facesDetected)
{
fcount++; //彩照用img,黑白照用img2
using (MemoryStream ms = new MemoryStream(img.ToJpegData(80)))
{
using (Image b = Image.FromStream(ms))
{
using (var bmpOut = new Bitmap(200, 200, PixelFormat.Format32bppRgb))
{
using (var g = Graphics.FromImage(bmpOut))
{
g.DrawImage(b, new Rectangle(0, 0, 200, 200), new Rectangle(item.X - 30, item.Y - 30, item.Width + 60, item.Height + 60), GraphicsUnit.Pixel);
}
bmpOut.Save(f.Replace(srcPath, outPath), ImageFormat.Jpeg);
} //只保留最先识别出来的人脸
break;
}
}
}
}
}
} if (fcount > 0)
{
Console.WriteLine("头像处理成功!");
}
else
{
Console.WriteLine("没有头像照片可供处理!");
} Console.ReadLine();
}
}
}

  

C#/.net/DotNet/Emgu.CV裁剪照片头像的更多相关文章

  1. 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)

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

  2. C# net Emgu.CV.World 人脸识别 根据照片将人脸抠图出来。

    Emgu.CV.World 人脸识别 根据照片将人脸抠图出来.效果如下: 应用范围:配合摄像头,抓取的图像,抠出人脸照片,这样人脸照片的大小会很小,传输速度快.这样识别速度也就快. 目前我正在做百度人 ...

  3. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

    背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...

  4. C#使用Emgu CV来进行图片人脸检测

    项目需求:某市级组织考试,在考试前需审核考生采集表中的考生照片是否合格,由于要审核的考生信息采集表有很多,原先进行的是手动人工审核,比较费时费力,审核的要求也很简单,并不判断考生是否是图片本人(身份验 ...

  5. [转载+原创]Emgu CV on C# (三) —— Emgu CV on 均衡化

    本文简要描述了均衡化原理及数学实现等理论问题,最终利用emgucv实现图像的灰度均衡. 直方图的均衡化,这是图像增强的常用方法. 一.均衡化原理及数学实现(转载) 均衡化原理及数学实现可重点参看——& ...

  6. [转载+原创]Emgu CV on C# (二) —— Emgu CV on 灰度化

    本文主要对彩色图片灰度化的方法及其实现过程进行总结,最终给出Emgu CV实现的代码. 一.灰度化原理及数学实现(转载自——<图像灰度化方法总结及其VC实现> 该篇文章使用opencv实现 ...

  7. 基于Emgu CV的人脸检测代码

    这个提供的代码例子是Emgu CV提供的源码里面自带的例子,很好用,基本不需要改,代码做的是人脸检测不是人脸识别,这个要分清楚.再就是新版本的Emgu CV可能会遇到系统32位和64位处理方式有区别的 ...

  8. Emgu.CV 播放视频

    using Emgu.CV; using System; using System.Drawing; using System.Threading; using System.Windows.Form ...

  9. Emgu.CV/opencv 绘图 线面文字包括中文

    绘图很简单 Emgu.CV.Image<Bgr, Byte> image;   使用image.Draw可以画各种图形和文字包括英文及数字,不支持中文   CircleF circle = ...

  10. yuv420p转为emgucv的图像格式Emgu.CV.Image<Bgr, Byte>

    GCHandle handle = GCHandle.Alloc(yuvs, GCHandleType.Pinned); Emgu.CV.Image<Bgr, Byte> image = ...

随机推荐

  1. 2021牛客OI赛前集训营-提高组(第三场) 第二题 交替 题解与结论证明

    题目描述 一个长度为 \(n\) 的数组\(A\),每秒都会变成一个长度为 \(n − 1\) 新数组 \(A'\),其变化规 则如下: 若当前数组 \(A\) 的长度 \(n\) 为偶数,则对于新数 ...

  2. 【解决方法】Windows快捷键Win+G无法使用,提示需要新应用打开链接

    环境: 系统版本:Windows 10 家庭中文版 问题描述: 描述:按下Win+G后弹出提示框,需要使用新应用以打开此 ms-gamingoverlay 链接 问题解释: 误将Xbox game b ...

  3. 使用GitHub当博客图床提升博客访问速度

    前言 作为一个穷逼来说站长来说,只有一个1M宽带这样的小水管服务器,如果博客稍微放一点图片到本地,然后人多点访问网站基本就很卡了,但又不想去吧图片放到图床里然后复制链接到文章里面那么麻烦 如何解决这个 ...

  4. 【Python基础】 什么是函数

    函数是一段可重用的代码块,它接受输入参数并返回输出.函数在程序设计中具有很多优点,如: 代码重用:在程序中可以重复调用相同的代码块,使程序更加简洁.高效. 模块化设计:函数是模块化设计的基本单元,可以 ...

  5. 通过Serverless私有化部署ChatGPT Web

    作为开发人员,想要自己部署一个渠道访问或是想随时访问但是奈何魔法有限,又或是海外服务器太贵,不想耗费这个钱,本文借助 Serverless 来搭建一下私有 ChatGPT 服务,Serverless ...

  6. 2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数。

    2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数. ...

  7. 2020-12-18:java和go,并发控制有哪几种方式?

    福哥答案2020-12-18: java:锁(Synchronized, ReentrantLock).信号量(Semaphore)以及其他同步工具.原子类(atomicInteger).加法器(ad ...

  8. 2022-01-16:小明手中有n块积木,并且小明知道每块积木的重量。现在小明希望将这些积木堆起来, 要求是任意一块积木如果想堆在另一块积木上面,那么要求: 1.上面的积木重量不能小于下面的积木重量;

    2022-01-16:小明手中有n块积木,并且小明知道每块积木的重量.现在小明希望将这些积木堆起来, 要求是任意一块积木如果想堆在另一块积木上面,那么要求: 1.上面的积木重量不能小于下面的积木重量: ...

  9. cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本。

    错误信息: cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本.有关详细信息,请参阅 https:/go.microsoft.com ...

  10. APP中RN页面热更新流程-ReactNative源码分析

    平时使用WebStorm或VSCode对RN工程中的文件修改后,在键盘上按一下快捷cmd+s进行文件保存,此时当前调试的RN页面就会自动进行刷新,这是RN开发相比于原生开发一个很大的优点:热更新. 那 ...