EmguCV库也能用来进行面部识别(face identify)。实际的面部识别,就是将一张图像上的人物的脸部识别出来,这是个很复杂的过程,具体过程我们这里不讨论。对一幅影像进行处理来找到包含脸部的那一部分是我们进行面部识别的第一个步骤。

大多数面部识别软件或多或少都是基于类哈尔特征(Haar-like feature)来进行识别的,他是哈尔小波(Haar wavelets)的一个应用,通过一些列的数学方法来定义一个矩形形状。2001年,Paul Viola和Michael Jones发表了Viola-Jones物体识别方法的框架,该框架基于识别Haar-like特征进行的。该方法和其他面部识别算法相比,所需要的运算量较小。所以这部分方法整合进了OpenCV库。

OpenCV和EmguCV中的面部识别是建立在一系列定义好了的识别规则基础之上的,规则以XML文件的形式存储,最初格式是由Rainer Lienhart定义的。在Emgu示例代码中该文件名为haarcascade_frontalface_default.xml。当然还有一系列的可以识别人物眼睛的规则在这些示例文件中,本例子中没有用到。

要使用Kinect SDK来构造一个简单的面部识别程序,首先创建一个名为KinectFaceFinder的WPF应用程序,然后引用Microsoft.Kinect, System.Drawing, Emgu.CV, Emgu.CV.UI, 和Emgu.Util. 并将所有以opencv_*开头的dll拷贝到程序编译的目录下面。最后将之前写好的两个扩展方法类库ImageExtension.cs和EmguImageExtensions.cs拷贝到项目中。项目的前端代码和之前的一样。只是在root根节点下面添加了一个名为rgbImage的Image控件。

<Window x:Class="FaceFinder.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" >
<Grid >
<Image HorizontalAlignment="Stretch" Name="rgbImage" VerticalAlignment="Stretch" />
</Grid>
</Window>

后台代码中,首先在MainWindow的构造函数中实例化KinectSensor对象然后配置彩色影像数据。因为我们使用EmguCV库来进行影像处理,所以我们可以直接使用RGB影像而不是深度影像。如下代码所示,代码中使用了BackgroundWork对象来从彩色影像数据流中拉取数据。每一次处理完了之后,拉取下一幅,然后继续处理。

KinectSensor _kinectSensor;
public MainWindow()
{
InitializeComponent(); this.Unloaded += delegate
{
_kinectSensor.ColorStream.Disable();
}; this.Loaded += delegate
{
_kinectSensor = KinectSensor.KinectSensors[];
_kinectSensor.ColorStream.Enable();
_kinectSensor.Start(); BackgroundWorker bw = new BackgroundWorker();
bw.RunWorkerCompleted += (a, b) => bw.RunWorkerAsync();
bw.DoWork += delegate { Pulse(); };
bw.RunWorkerAsync();
};
}

上面代码中,Pluse方法处理BackgroundWork的DoWork事件,这个方法是这个例子的主要方法。下面的代码简单的对Emgu提供的示例代码进行了一点修改。我们基于提供的脸部识别规则文件实例化了一个新的HaarCascade类。然后我们从彩色影像数据流获取了一幅影像,然后将他转换为了Emgu能够处理的格式。然后对图像进行灰度拉伸然后提高对比度来使得脸部识别更加容易。Haar识别准则应用到图像上去来产生一些列的结构来指示哪个地方是识别出来的脸部。处理完的影像然后转换为BitmapSource类型,最后后复制给Image控件。因为WPF线程的工作方式,我们使用Dispatcher对象来在正确的线程中给Image控件赋值。

String faceFileName = "haarcascade_frontalface_default.xml";
public void Pulse()
{
using (HaarCascade face = new HaarCascade(faceFileName))
{
var frame = _kinectSensor.ColorStream.OpenNextFrame();
var image = frame.ToOpenCVImage<Rgb, Byte>();
using (Image<Gray, Byte> gray = image.Convert<Gray, Byte>()) //Convert it to Grayscale
{
//normalizes brightness and increases contrast of the image
gray._EqualizeHist(); //Detect the faces from the gray scale image and store the locations as rectangle
//The first dimensional is the channel
//The second dimension is the index of the rectangle in the specific channel
MCvAvgComp[] facesDetected = face.Detect(
gray,
1.1,
,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new System.Drawing.Size(, )); Image<Rgb, Byte> laughingMan = new Image<Rgb, byte>("laughing_man.jpg");
foreach (MCvAvgComp f in facesDetected)
{
image.Draw(f.rect, new Rgb(System.Drawing.Color.Blue), );
}
Dispatcher.BeginInvoke(new Action(() => { rgbImage.Source = image.ToBitmapSource(); }));
}
}
}

既然facesDetected包含了识别出来的脸部的位置信息,我们能够使用脸部识别算法来建立一个现实增强应用。我们可以将一个图片放到脸部位置,而不是用矩形框来显示。下面的代码显示了我们如何使用一个图片替代蓝色的矩形框

Image<Rgb, Byte> laughingMan = new Image<Rgb, byte>("laughing_man.jpg");
foreach (MCvAvgComp f in facesDetected)
{ //image.Draw(f.rect, new Rgb(System.Drawing.Color.Blue), 2);
var rect = new System.Drawing.Rectangle(f.rect.X - f.rect.Width /
, f.rect.Y - f.rect.Height /
, f.rect.Width *
, f.rect.Height * ); var newImage = laughingMan.Resize(rect.Width, rect.Height, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR); for (int i = ; i < (rect.Height); i++)
{
for (int j = ; j < (rect.Width); j++)
{
if (newImage[i, j].Blue != && newImage[i, j].Red != && newImage[i, j].Green != )
image[i + rect.Y, j + rect.X] = newImage[i, j];
} }
}

Kinect 开发 —— 面部识别的更多相关文章

  1. Kinect开发笔记之二Kinect for Windows 2.0新功能

    这是本博客翻译文档的第一篇文章.笔者已经苦逼的竭尽全力的在翻译了.但无奈英语水平也是非常有限.不正确或者不妥当不准确的地方必定会有,还恳请大家留言或者邮件我以批评指正.我会虚心接受. 谢谢大家.   ...

  2. Kinect 开发 —— 杂一

    Kinect 提供了非托管(C++)和托管(.NET)两种开发方式的SDK,如果您用C++开发的话,需要安装Speech Runtime(V11),Kinect for Windows Runtime ...

  3. Kinect开发文章目录

    整理了一下去年为止到现在写的和翻译的Kinect的相关文章,方便大家查看.另外,最近京东上微软在搞活动, 微软 Kinect for Windows 京东十周年专供礼包 ,如果您想从事Kinect开发 ...

  4. Kinect开发资源汇总

    Kinect开发资源汇总   转自: http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=254&highlight=kinec ...

  5. Kinect开发学习笔记之(一)Kinect介绍和应用

    Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...

  6. Kinect 开发 —— 控制PPT播放

    实现Kinect控制幻灯片播放很简单,主要思路是:使用Kinect捕捉人体动作,然后根据识别出来的动作向系统发出点击向前,向后按键的事件,从而使得幻灯片能够切换. 这里的核心功能在于手势的识别,我们在 ...

  7. Kinect 开发 —— 全息图

    Kinect的另一个有趣的应用是伪全息图(pseudo-hologram).3D图像可以根据人物在Kinect前面的各种位置进行倾斜和移动.如果方法够好,可以营造出3D控件中3D图像的效果,这样可以用 ...

  8. Kinect 开发 —— 进阶指引(上)

    本文将会介绍一些第三方类库如何来帮助处理Kinect传感器提供的数据.使用不同的技术进行Kinect开发,可以发掘出Kinect应用的强大功能.另一方面如果不使用这些为了特定处理目的而开发的一些类库, ...

  9. Kinect开发 —— 基础知识

    转自:http://www.cnblogs.com/yangecnu/archive/2012/04/02/KinectSDK_Application_Fundamentals_Part2.html ...

随机推荐

  1. <Three.js>(第一节)环境搭建

    Three.js顾名思义3D的js库.是运行在浏览器的基于webgl的3D引擎.该引擎是github上的一个开源项目,下载地址:https://github.com/mrdoob/three.js/ ...

  2. UI Framework-1: Browser Window

    Browser Window The Chromium browser window is represented by several objects, some of which are incl ...

  3. Linux Putty 复制粘贴

    从putty复制:    用左键选中文字,再其他地方点中键就可以粘贴了,不需要右键粘贴. 在putty中粘贴:    在其他地方用左键选中文字,不用右键复制,保持选中文字高亮,然后在putty中点中键 ...

  4. twig 模板引擎使渲染视图更加优雅

    在使用 laravel 的时候接触过 blade 模板引擎.在学习的时候,接触到了另外一个强大的模板引擎:twig 官网:https://twig.sensiolabs.org/ 中文手册:http: ...

  5. IDEA修改当前工程jdk版本

    1.ctrl+shift+alt+s 2.根据实际情况修改jdk版本

  6. AFNetworking框架的使用

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...

  7. ISheet ICell

    /// <summary> /// Gets the first row on the sheet /// </summary> /// <value>the nu ...

  8. pig安装配置

    pig的安装配置很简单,只需要配置一下环境变量和指向hadoop conf的环境变量就行了 1.上传 2.解压 3.配置环境变量 Pig工作模式 本地模式:只需要配置PATH环境变量${PIG_HOM ...

  9. 方便查看线程状况的jsp页面

    此方法来自深入理解java虚拟机一书,用作管理员页面,可以随时用浏览器查看线程堆栈 <%@ page language="java" import="java.ut ...

  10. n阶幻方问题

    转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录        第一节 n阶幻方问题       第二节 由n阶幻方引发 ...