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,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是"静态的",一种是"动态的" ...
随机推荐
- PL/SQL 学习分享
PL SQL概述 什么是PLSQL PLSQL的特点 PLSQL的开发环境 PLSQL的工作原理 语句块重点部分 PLSQL声明命名规则 声明 命名规则 表达式和运算符 表达式的分类 运算符分类 流程 ...
- 11月份 chrome 标签整理
Spring MVC框架相关 Java Web开发 和 linux下开发 汇总 项目源码 优秀的音视频开源框架 常用软件的下载 学习资源或网站 最后分享一些以前收藏的优秀博客 这两天经过3次面试,很幸 ...
- debian 屌丝日记
好几年前,刚开始学习linux时,写的笔记,现在看来还挺有意思的,发出来 纪念下 1.安装debian系统,只安装最基本系统 不要桌面,不要print server,具体不会看网上图文并茂的 1) ...
- Java复习整理 Day02
1 package demo01; 2 3 import java.util.Scanner; 4 5 public class ScannerDemo01 { 6 public static voi ...
- CF 1244 C - The Football Season
C - The Football Season 先考虑求解 \[ x\times w + y\times d=p \] 若存在一组解 \[ \begin{cases} x_0\\ y_0 = kw + ...
- 【uva 534】Frogger(图论--最小瓶颈路 模版题)
题意:平面上有N个石头,给出坐标.一只青蛙从1号石头跳到2号石头,使路径上的最长便最短.输出这个值.(2≤N≤200) 解法:最小瓶颈树.而由于这题N比较小便可以用2种方法:1.最短路径中提到过的Fl ...
- Educational Codeforces Round 90 (Rated for Div. 2) A. Donut Shops(数学)
题目链接:https://codeforces.com/contest/1373/problem/A 题意 有两种包装的甜甜圈,第一种 $1$ 个 $a$ 元,第二种 $b$ 个 $c$ 元,问买多少 ...
- hdu3506 Monkey Party
Problem Description Far away from our world, there is a banana forest. And many lovely monkeys live ...
- 牛客编程巅峰赛S1第5场 - 青铜&白银 C.排队 (优先队列,归并排序)
题意:有\(m\)个窗口,\(n\)个人排队,每个人都有各自的办理时间,只有办理完成窗口才能空出来,后面的人开始办理,求有多少人比后面的人开始办理的早但完成的晚. 题解:我们可以用优先队列来模拟办理, ...
- 【论文笔记】AutoML for MCA on Mobile Devices——论文解读与代码解析
理论部分 方法介绍 本节将详细介绍AMC的算法流程.AMC旨在自动地找出每层的冗余参数. AMC训练一个强化学习的策略,对每个卷积层会给出其action(即压缩率),然后根据压缩率进行裁枝.裁枝后,A ...