C#使用OpenCV剪切图形中的人物头像
前言
本文主要介绍如何使用OpenCV剪切图形中的人物头像。
准备工作
首先创建一个Wpf项目——OpenCV_Face_Wpf,这里版本使用Framework4.7.2。
然后使用Nuget搜索【Emgu.CV】,如下图。

这里的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows。
然后下载所需文件haarcascade_frontalface_default.xml。
可以去OpenCV的开源代码中下载,下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades。
然后将文件加入进项目,并修改属性,让xml文件输出到启动目录,如下图。

使用OPenCV剪切人脸部分
现在,我们进入项目,进行OPenCV的调用。
首先引入命名空间,如下:
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.Drawing;
using System.Windows.Forms;
然后编写人脸剪切函数——CutFace。
函数里,我们先使用CascadeClassifier类读取haarcascade_frontalface_default.xml文件,建立人脸检测的对象。
再使用Mat类来导入图片(灰度模式)。
然后再使用人脸检测的对象的方法——DetectMultiScale进行人脸数量识别。
最后通过Bitmap类把识别出来的人脸进行剪切保存。
代码如下:
public void CutFace(string filename)
{
//CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;//使用GPU运算
var face = new CascadeClassifier("haarcascade_frontalface_default.xml");
var mat = new Mat(filename, ImreadModes.Grayscale);//灰度导入图片
int minNeighbors = 7;//最小矩阵组,默认3
var size = new System.Drawing.Size(10, 10);//最小头像大小
var facesDetected = face.DetectMultiScale(mat, 1.1, minNeighbors, size);
//循环把人脸部分切割出来并保存
int index = 0;
var bitmap = Bitmap.FromFile(filename);
foreach (var item in facesDetected)
{
index++;
var bmpOut = new Bitmap(item.Width, item.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
var g = Graphics.FromImage(bmpOut);
g.DrawImage(bitmap, new System.Drawing.Rectangle(0, 0, item.Width, item.Height),
new System.Drawing.Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
g.Dispose();
bmpOut.Save($"Face_{index}.png", System.Drawing.Imaging.ImageFormat.Png);
bmpOut.Dispose();
}
bitmap.Dispose();
mat.Dispose();
face.Dispose();
}
然后编写一个打开文件的函数,在成功打开文件后调用CutFace。
public void SelectImg()
{
System.Windows.Forms.OpenFileDialog frm = new System.Windows.Forms.OpenFileDialog();
frm.Filter = "(*.jpg,*.png,*.jpeg,*.bmp)|*.jgp;*.png;*.jpeg;*.bmp|All files(*.*)|*.*";
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
CutFace(frm.FileName);
}
}
现在我们启动项目,如下图:

运行结果
点击界面中的打开图片,选中带人脸的图片进行测试。
代码中默认把剪切的图片保存到Debug文件夹下,我们打开Debug文件夹,如下图:

因为我选中的图片只有一个人脸,所以得到一个剪切图片——Face_1.png。
原图与剪切后的图片对比如下:

现在,我们换一个人脸多的图片,再测试一下。测试图片如下。

运行后结果如下:

----------------------------------------------------------------------------------------------------
到此C#使用OpenCV剪切图形中的人物头像就已经介绍完了。
代码已经传到Github上了,欢迎大家下载。
Github地址: https://github.com/kiba518/OpenCV_Face_Wpf
----------------------------------------------------------------------------------------------------
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!
https://www.cnblogs.com/kiba/p/14428557.html

C#使用OpenCV剪切图形中的人物头像的更多相关文章
- C#使用OpenCV剪切图像中的圆形和矩形
前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.C ...
- [ javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中 ] javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中方法演示 效果之三
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- [学习opencv]高斯、中值、均值、双边滤波
http://www.cnblogs.com/tiandsp/archive/2013/04/20/3031862.html [学习opencv]高斯.中值.均值.双边滤波 四种经典滤波算法,在ope ...
- zabbix 在图形中显示网络设备的接口描述
zabbix原始模板没有提供来显示网络设备接口的描述,我们通常看到的图形显示是下面这样的: zabbix 3之后图形显示变化蛮大的,但我们乍一看,并不知道这个ethernet0/1是什么接口,网络设备 ...
- 【opencv基础】OpenCV从Mat中提取某些行或列
这两个函数返回的是指向原矩阵内部位置的指针,类似于浅拷贝: code cv::Mat align_mean(cv::Mat mean, cv::Rect facebox, float scaling_ ...
- 关于Entity Framework更新的几种方式以及可能遇到的问题(附加类型“Model”的实体失败,因为相同类型的其他实体已具有相同的主键值)在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为
在日常使用Entity Framework中,数据更新通常会用到.下面就简单封装了一个DBContext类 public partial class EFContext<T> : DbCo ...
- OpenCV 3.0中IplImage* 转cv::Mat
在OpenCV 2.0中使用: IplImage * ipl1, *ipl2; // ... const cv::Mat m = cv::Mat(ipl,false); cv::Mat m2 = ip ...
- 以交互方式将文本添加到图形中(matlab)
这篇博客记录一下怎么用matlab在图形中简单的添加一些文本,以直方图均衡化为例.先看几张图片吧,第一幅是较暗的花粉的电子显微图像和对应的直方图,第二幅是其直方图均衡化的图像和对应的直方图,第三幅是对 ...
- Opencv在视频中静态、动态方式绘制矩形框ROI
Opencv视频处理中的目标跟踪经常用到要在视频上画一个矩形框ROI,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是"静态的",一种是"动态的" ...
随机推荐
- Spark:常用transformation及action,spark算子详解
常用transformation及action介绍,spark算子详解 一.常用transformation介绍 1.1 transformation操作实例 二.常用action介绍 2.1 act ...
- Spring 启动脚本
if [ $# != 3 ];then echo 'option-1: start,stop or restart.' echo 'option-2: 请传入jar路径' echo 'option-3 ...
- 获取 *.properties配置文件内容
package com.loan.modules.common.util; import java.util.ResourceBundle; /** * 获取 *.properties配置文件内容 * ...
- 文本处理三剑客简介(grep、awk、sed)
本章内容: 命令 描述 awk 支持所有的正则表达式 sed 默认不支持扩展表达式,加-r 选项开启 ERE,如果不加-r 使用花括号要加转义符\{\} grep 默认不支持扩展表达式,加-E 选项开 ...
- VSCode-Prettier和ESLint如何和睦共处?
1 在VSCode中单独使用Prettier保存代码自动格式化的配置方法 1.1 为什么要使用Prettier? 手动调整代码格式,不仅低效,而且在团队协作开发中,无法保证代码风格统一,所以需要引入自 ...
- 【STM32】时钟
1. 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL: ① HSI是高速内部时钟,RC振荡器,频率为8MHz: ② HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源 ...
- Pytest(6)重复运行用例pytest-repeat
前言 平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来. 自动化运行用例时候,也会出现偶然的bug,可以针对单个用例, ...
- .Net技术栈下的异步,你还在用同步方式进行开发吗?
关于异步,其实是个老生常谈的话题,也是各大公司面试常问的问题之一.本文就几个点来介绍异步解决的问题 注:对多线程的运行的基本机制要了解 1.介绍 有人可能会有疑问,为什么并行,非得用异步.多线程也已可 ...
- Hive调优相关
前言 Hive是由Facebook 开源用于解决海量结构化日志的数据统计,是基于Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL查询功能. 在资源有限的情况下,提 ...
- hdu2126 Buy the souvenirs
Problem Description When the winter holiday comes, a lot of people will have a trip. Generally, ther ...