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

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. [C++提高编程] 3.5 stack容器

    文章目录 3.5 stack容器 3.5.1 stack 基本概念 3.5.2 stack 常用接口 3.5 stack容器 3.5.1 stack 基本概念 概念:stack是一种先进后出(Firs ...

  2. [人脸活体检测] 论文:Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection

    Aurora Guard- Real-Time Face Anti-Spoofing via Light Reflection 论文简介 该论文提出的方法已经部署到百万台终端,整篇文章底气十足.作者设 ...

  3. [Pytorch框架] 1.3、张量

    文章目录 PyTorch是什么? Tensors(张量) NumPy 转换 CUDA 张量 PyTorch是什么? 基于Python的科学计算包,服务于以下两种场景: 作为NumPy的替代品,可以使用 ...

  4. CF1808E Minibuses on Venus 智商毁灭记

    都要考省选了大脑还在这里下线 场上看到这道题很快推出了 \(k\) 为奇数的搞法,发现可以直接做到 \(O(k\log n)\),一阵狂喜然后肝起了 E3,结果 E1 都没过. 事实上这道题可以直接做 ...

  5. String、StringBuilder、StringBuffer使用场景

    String:加了final修饰,长度不可变,每次修改会创建新String:操作少量数据或者不需要操作数据时使用. StringBuilder:长度可变,线程不安全:在需要频繁操作数据且不需要考虑线程 ...

  6. iview中时间选择器组件改变日期格式

    //改变视图的显示格式,但不会改变value的值的格式 format="yyyy-MM-dd" //改变value值的格式 @on-change="anZhuangDat ...

  7. 2021-05-16:时间复杂度必须是logN,如何求阶乘从右向左第一个不为零的数?

    2021-05-16:时间复杂度必须是logN,如何求阶乘从右向左第一个不为零的数? 福大大 答案2021-05-16: 这道题logN的解法是大步小步法,网上非常难找.另外论代码简洁度,明显是我的代 ...

  8. Django4全栈进阶之路22 项目实战(三种方式开发部门管理):方式三:FBV+ModelForm+get_object_or_404

    1.视图 @login_required def department_list_view(request): departments = Department.objects.all() retur ...

  9. vue全家桶进阶之路40:Vue3父件传值给子件

    在Vue3中,可以通过props将父组件的数据传递给子组件.具体步骤如下: 在父组件中定义要传递给子组件的数据,可以是data属性中的数据或者是计算属性computed中的数据. 在子组件中通过pro ...

  10. uni-app 真机运行

    运行-运行到手机或模拟器 注意事项: 1.真机运行时需要开启开发者选项中的USB调试和USB安装,否则app无法通过USB安装到手机或平板中. 2.模拟器功能有,单模拟机没有,需要自己安装,然后开放端 ...