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

到此这篇关于C#使用OpenCV剪切图片中的人物头像的文章就介绍到这了,更多相关C# OpenCV剪切图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#调用OpenCV开发简易版美图工具【推荐】

    前言 在C#调用OpenCV其实非常简单,因为C#中有很多OPenCV的开源类库. 本文主要介绍在WPF项目中使用OpenCVSharp3-AnyCPU开源类库处理图片,下面我们先来做开发前的准备工作. 准备工作 首先,我们先创建一个WPF项目. 然后,在Nuget上搜索OpenCVSharp,如下图: 接着,我们选择OpenCVSharp3-AnyCPU选项进行安装 . 安装了OpenCVSharp3-AnyCPU后,我们的项目会自动引入4个类库,如下图: 到这里,我们的准备工作就完成了,非常

  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

     1.什么是OpenCVSharp 为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法(GOCW):这几天在搜集资料的时候,偶尔看见了OpenCVSharp,从时间上来看,它已经经过了更久的发展,应该有许多直接借鉴.或者直接使用的地方. OpenCVSharp有一名日本工程师开发,项目地址为:https://github.com/shimat/opencvsharp.其是OpenCV的.NET wrapper,它比Emgucv更接近于原始的Open

  • C#中OpenCvSharp 通过特征点匹配图片的方法

    现在的手游基本都是重复操作,一个动作要等好久,结束之后继续另一个动作.很麻烦,所以动起了自己写一个游戏辅助的心思. 这个辅助本身没什么难度,就是通过不断的截图,然后从这个截图中找出预先截好的能代表相应动作的按钮或者触发条件的小图. 找到之后获取该子区域的左上角坐标,然后通过windows API调用鼠标或者键盘做操作就行了. 这里面最难的也就是找图了,因为要精准找图,而且最好能适应不同的分辨率下找图,所以在模板匹配的基础上,就有了SIFT和SURF的特征点找图方式. 在写的过程中查找资料,大都是

  • 利用C#版OpenCV实现圆心求取实例代码

    前言 OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com/shimat/opencvsharp. 该源码是 BSD开放协议,BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布或商业化销售. 1.OpenCVSharp的下载 可以直接从上面的github上下载源码,自行编译引用: 也可用vs中的nuget

  • C#中OpenCVSharp实现轮廓检测

    OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的.OpenCVSharp封装了这个函数,有2个参数(contours,hierarchy)要做特别的说明. public static void FindContours(InputOutputArray image, out Point[][] contours, out HierarchyIndex[] hierarchy, RetrievalModes

  • 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:/

  • python+opencv识别图片中的圆形

    本文实例为大家分享了python+opencv识别图片中足球的方法,供大家参考,具体内容如下 先补充下霍夫圆变换的几个参数知识: dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器.上述文字不好理解的话,来看例子吧.例如,如果dp= 1时,累加器和输入图像具有相同的分辨率.如果dp=2,累加器便有输入图像一半那么大的宽度和高度. minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离.这

  • 基于jquery实现人物头像跟随鼠标转动

    一款非常乖巧的人物头像跟随鼠标转动效果,在浏览器屏幕内,人物脸庞始终面向鼠标转动.其实现原理即同一张图片上作出人物上下左右不同面向的效果,利用JS调用背景图片的位置,以此实现人物"转脸"的jquery特效效果. 先给大家展示效果图,需要的朋友可以下载源码 效果演示  源码下载 具体实现过程不多说了,直接给大家贴代码了. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q

  • python3+openCV 获取图片中文本区域的最小外接矩形实例

    我就废话不多说了,大家还是直接看代码吧! print("thresh =",thresh) coords = np.column_stack(np.where(thresh > 0))//获取thresh二值灰度图片中的白色文字区域的点 print("coords =",coords) min_rect = cv2.minAreaRect(coords)//由点集获取最小矩形(包含中心坐标点.宽和高.偏转角度) print("min_rec =&qu

  • C#使用OpenCV剪切图像中的圆形和矩形的示例代码

    前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.CV],如下图. 这里的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows. 使用OPenCV剪切矩形 现在,我们进入项目,进行OPenCV的调用. 首先引入命名空间,如下: using Emgu.CV; using Emgu.CV.Cv

  • Python face_recognition实现AI识别图片中的人物

    目录 前言 环境安装 代码使用 总结 前言 最近碰到了照片识别的场景,正好使用了face_recognition项目,给大家分享分享.face_recognition项目能做的很多,人脸检测功能也是有的,是一个比较成熟的项目.该项目的github地址:github仓库 本文主要是对该项目的安装使用,后面会更新一篇我自己写的实现人脸检测的代码,可以直接使用. 环境安装 首先我们看看官方给出的人脸识别效果图 我们看一下README关于安装环境的信息 官方给出的可安装操作系统是Mac和Linux,但是

  • Java+OpenCV实现图片中的人脸识别

    目录 MatOfRect.detectMultiScale函数 实现代码 ImageViewer.java DetectFace.java 运行 把识别出来的脸存成文件 经过前三个教程,我们可以知道了OpenCV的基本使用了. 今天,我们就要讲OpenCV中认出,这是一个人脸是怎么做的. MatOfRect.detectMultiScale函数 OpenCV用的是detectMultiScale来认出这是一个脸的.记得,这只是认出这是一个脸,而不是这个脸是谁. 这个脸是谁我们会逐步展开,前面勿求

  • Python+OpenCV实现图片中的圆形检测

    效果展示 中心的三个没检测到 import cv2 import numpy as np import matplotlib.pyplot as plt w = 20 h = 5 params = cv2.SimpleBlobDetector_Params() # Setup SimpleBlobDetector parameters. print('params') print(params) print(type(params)) # Filter by Area. params.filte

  • python3+opencv3识别图片中的物体并截取的方法

    如下所示: 运行环境:python3.6.4 opencv3.4.0 # -*- coding:utf-8 -*- """ Note: 使用Python和OpenCV检测图像中的物体并将物体裁剪下来 """ import cv2 import numpy as np # step1:加载图片,转成灰度图 image = cv2.imread("353.jpg") gray = cv2.cvtColor(image, cv2.C

  • python opencv设置摄像头分辨率以及各个参数的方法

    1,为了获取视频,你应该创建一个 VideoCapture 对象.他的参数可以是设备的索引号,或者是一个视频文件.设备索引号就是在指定要使用的摄像头.一般的笔记本电脑都有内置摄像头.所以参数就是 0.你可以通过设置成 1 或者其他的来选择别的摄像头.之后,你就可以一帧一帧的捕获视频了.但是最后,别忘了停止捕获视频.使用 ls /dev/video*命令可以查看摄像头设备 2,cap.read() 返回一个布尔值(True/False).如果帧读取的是正确的,就是 True.所以最后你可以通过检查

随机推荐