【Win10 应用开发】人脸识别

原文:【Win10 应用开发】人脸识别

可能你会认为人脸识别用起来会很复杂,老周当初也这么想,但通过实际操作后,我发现非然。

经过微软封装的东西,向来都是复杂问题简单化,只要用得舒心,代码越少越好,用最少的代码做最多的事情,此为大师境界也。

好,屁话不说,先介绍一下如何完成人脸识别(或者叫人脸检测,随你怎么翻译,反正知道是怎么一回事就行)。核心的类是FaceDetector,不要问我这个类在哪里,自己打开对象浏览器搜索。

第一步,访问静态属性IsSupported,看看当前平台是不是支持人脸识别,如果返回false,那就没戏了。

第二步,调用静态方法CreateAsync得到一个FaceDetector实例,所以该类不需要手动实例化,初始化过程由运行库来完成,然后把初始化好的实例返回给咱们,然后就可以用它来干活了。

第三步,调用实例方法DetectFacesAsync进行识别,识别完后会返回一个DetectedFace列表,每个DetectedFace表示一张脸,因为你用来识别的照片中可能包含N张脸。FaceBox属性包含了人脸的矩形区域,就是人脸位于整张照片的哪个位置,可通过X,Y坐标描述矩形的左上角位置,并用宽度和高度来表明那张脸的大小。

DetectFacesAsync方法需要一个SoftwareBitmap类型的参数,该参数就是你要用来识别人脸的图像。

可能大家已经知道,通过BitmapDecoder类的GetSoftwareBitmapAsync方法可以返回一个SoftwareBitmap实例,不过要注意的是,FaceDetector在进行检测时并不是所有像素格式都支持,可以调用GetSupportedBitmapPixelFormats方法来获取所有受支持的像素格式列表,经老周测试,该方法返回Nv12和Gray8,也就是当前只支持这两种格式。当然,你也可以通过IsBitmapPixelFormatSupported方法来验证一下某个像素格式是否被支持。

 

好了,基本用法已经说完了,确实不是很复杂。下面,老周给大家演示一个例子,该例子允许你选择一张照片,然后识别出照片上的人脸,并用一个矩形来标记。

先看看UI的设计,主要的XAML如下:

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <Button Content="选择要识别的照片" Click="OnClick"/>
            <Viewbox  Grid.Row="1" Margin="5" Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Canvas Name="cv" Width="{x:Bind img.Width,Mode=OneWay}" Height="{x:Bind img.Height,Mode=OneWay}" >
                    <Image Name="img" Stretch="None"/>
                </Canvas>
            </Viewbox>

            <TextBlock Name="tbMessage" Foreground="Red" FontSize="16" Grid.Row="2"/>
        </Grid>

为啥我要用一个ViewBox呢,因为这个控件有一个好处,就是会自动将它里面的可视化对象进行缩放,待会儿我要在Image上显示图片,而且还要用到Rectangle元素来标记人脸的位置,为了让绝对坐标计算起来能与原图相等,就把这些内容都放在ViewBox中,让Viewbox来进行缩放,这样一来,就能够根据窗口的大小自动调整显示区域了。

之所以用Canvas,是因它是绝对坐标定位的,这方便我稍后放置Rectangle元素。

 

处理按钮事件,通过OpenFilePicker来打开图像文件。

            FileOpenPicker picker = new FileOpenPicker();
            picker.FileTypeFilter.Add(".jpg");
            picker.FileTypeFilter.Add(".jpeg");
            picker.FileTypeFilter.Add(".png");

            StorageFile file = await picker.PickSingleFileAsync();

记得以前跟大家讲过,picker调用后要挂起当前应用,并通过响应应用激活来处理获取的文件,这是在WP 8.1的文章中说过,但是,现在不用了,很简单,因为Windows Phone App和Windows App已经完全统一了,所以不必再考虑平台隔离的代码了。

下面代码完成两件事:1、在Image控件上显示图像;2、进行识别,并用矩形标记人脸位置。

            if (file != null)
            {
                using (IRandomAccessStream streamIn= await file.OpenReadAsync())
                {
                    // 对图像文件进行解码
                    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(streamIn);
                    // 获取图像内容
                    SoftwareBitmap sbmp = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight);

                    WriteableBitmap bmp = new WriteableBitmap(sbmp.PixelWidth, sbmp.PixelHeight);
                    sbmp.CopyToBuffer(bmp.PixelBuffer);
                    this.img.Source = bmp;
                    img.Width = bmp.PixelWidth;
                    img.Height = bmp.PixelHeight;

                    // 通过循环,尝试以各种受支持的格式来进行识别
                    // 如果识别顺利,就跳出循环
                    // 否则进入下一轮循环
                    int n = 0;
                    while (n < formats.Count)
                    {
                        if (FaceDetector.IsBitmapPixelFormatSupported(formats[n]))
                        {
                            FaceDetector detector = await FaceDetector.CreateAsync();
                            try
                            {
                                // 转换图像像素格式
                                SoftwareBitmap sbmp2 = SoftwareBitmap.Convert(sbmp, formats[n]);
                                // 进行检测
                                IList<DetectedFace> results = await detector.DetectFacesAsync(sbmp2);

                                // 清理Canvas中的矩形
                                while (cv.Children.Count > 1)
                                    cv.Children.RemoveAt(cv.Children.Count - 1);
                                // 在界面上添加矩形
                                for (int i = 0; i < results.Count; i++)
                                {
                                    DetectedFace dface = results[i];
                                    Rectangle rect = new Rectangle();

                                    rect.Stroke = new SolidColorBrush(Colors.Yellow);
                                    rect.StrokeThickness = 5d;
                                    // 定位矩形
                                    Canvas.SetLeft(rect, dface.FaceBox.X);
                                    Canvas.SetTop(rect, dface.FaceBox.Y);
                                    rect.Width = dface.FaceBox.Width;
                                    rect.Height = dface.FaceBox.Height;
                                    cv.Children.Add(rect);
                                }
                                tbMessage.Text = "人脸识别完成。";
                                break;
                            }
                            catch
                            {
                                tbMessage.Text = "人脸识别失败。";
                                n++;
                            }
                            //cv.InvalidateArrange();
                        }
                    }

                }

因为我要在Image上显示图像,所以从decoder中得到的SoftwareBitmap不能直接用于识别,原因是我刚才说了,目前SDK的人脸识别只支持少量的像素格式,Bgra8是不受支持的,所以可以用SoftwareBitmap的Convert方法转换格式,并返回转换后的SoftwareBitmap对象。

这里我用一个while循环来完成识别:

                    int n = 0;
                    while (n < formats.Count)
                    {
                        if (FaceDetector.IsBitmapPixelFormatSupported(formats[n]))
                        {
                            FaceDetector detector = await FaceDetector.CreateAsync();
                            try
                            {
                                ……
                                break;
                            }
                            catch
                            {
                                ……
                                n++;
                            }
                        }

意思是,我用FaceDetector所支持的所有像素格式都去尝试进行识别,只要其中有一种格式能够顺利完成识别,就终止循环(break);如果第一种格式不能识别,就把n++来使用第二种格式来识别。

=============================================

示例的大致情况就是这样,做完后我们当然要来试试效果了。

首先,来检测一下八戒的猪脸。

很显然,猪脸也能检测出来,不错。

接着,我又请神仙妹妹来试镜。发现效果甚好。

    

然后,我又找来一位MM再试,效果也甚佳。

 

怎么样,这姿势不错吧。

示例源码下载:http://files.cnblogs.com/files/tcjiaan/FaceDetApp.zip

 

时间: 2024-09-15 16:38:18

【Win10 应用开发】人脸识别的相关文章

Win10系统使用人脸识别技术及必备条件

  人脸识别,大家都听说过,但是有点陌生,因为它还没有广泛使用.Win10系统也能使用人脸识别技术,但有条件:具备摄像头的联想电脑和使用联想VeriFace专用软件.如何使用呢? 步骤 1.双击setup.exe安装程序,点击 下一步 开始联想VeriFace 软件安装; 2.仔细阅读联想VeriFace 软件安装协议,如果您同意该协议,点击 接受 继续安装; 3.默认安装到系统盘C盘,点击 下一步 系统开始复制文件; 4.点 完成 ,完成安装. 双击桌面图标打开软件; 点击"启动Verifac

还有王法吗?美国联邦调查局开发人脸识别系统,数据源涉及公民隐私

美国政府问责局(GAO)今日发布了一份报告,该报告称:美国联邦调查局(FBI)开发了一个庞大的人脸识别系统,该系统包含了面部分析.比较和评价的功能. 政府部门表示,FBI开发的的人脸识别系统可以获得大量的证件照片的访问权限,照片数量多达41.1亿.可以看出来FBI对这件事儿也非常重视,特意为他的人脸识别系统的照片库建立了一个数据库,并起了名字叫做"下代识别"( Next Generation Identification).数据库中有3千万的照片是来自曾经犯罪的入档照片.那剩下那么多照

Google禁止开发者为谷歌眼镜开发人脸识别App

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   [ 科技讯]6月3日消息,可能很 多人都在担心人脸识别app带来的隐私漏洞?Google的回答是,它也不希望这种情况的发生.Google 刚刚更新了谷歌眼镜的 开发者规范,明确禁止人脸识别App的开发.     在Google+的更新中,Google解释道:"如同我们 多年来一直坚持的那样,没有可靠的隐私保护措施,我们不会在产品中增加人脸识别功能.因此

谷歌将开发人脸识别手机 本地处理不依赖云计算

谷歌与芯片创业公司Movidius宣布合作将深度学习技术引入智能手机. 北京时间1月28日午间消息,谷歌正在与硅谷的一家芯片设计公司合作开发一种技术,让智能手机借助自身的处理能力识别照片和视频中的物体,而不再依赖远程数据中心的帮助. 谷歌与芯片创业公司Movidius周三宣布了这项合作,他们希望将这种名为深度学习的技术引入智能手机. 谷歌已经在Google photos中展示了图像识别功能,这款移动应用不仅可以存储人们通过智能手机上传的图片,而且能对其加以分析.用户还可以通过输入物体名称的方式进

我想有个应用:人脸识别社交APP

我想有个应用,每天需找一个idea,好玩的,有趣的,咱们一起来侃侃.进入到移动互联网时代,通过手机APP能实现的事儿是越来越多咯!如果哪天你在街上被对面素不相识的人认出来.不用奇怪,他也许是真的用了Google人脸识别App,Google Goggles.Google的人脸识别技术开始于Goggles识别系统时期.用手机拍下周遭的物体照片然后发送给Goggles,Goggles就能通过对不同种类图片的搜索找出最合适的结果.发展到今天,Google人脸识别app,GoogleGoggles则专门用

PHP使用Face++接口开发微信公众平台人脸识别系统的方法_php实例

本文实例讲述了PHP使用Face++接口开发微信公众平台人脸识别系统的方法.分享给大家供大家参考.具体如下: 效果图如下: 具体步骤如下: 首先,先登录Face++的官网注册账号:官网链接 注册之后会获取到api_secret和api_key,这些在调用接口的时候需要用到. 然后接下来的就是使用PHP脚本调用API了. 在使用PHP开发微信公共平台的时候,推荐使用Github上的一款不错的框架:wechat-php-sdk 对于微信的常用接口做了一些封装,核心文件wechat.class.php

微信公众平台消息接口开发(24)图片识别之人脸识别API

微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 图片识别 人脸识别 API 作者:方倍工作室  原文:http://www.cnblogs.com/txw1958/archive/2013/03/13/weixin-if24-face-recognize-api.html   一.微信图片获取 首先要获得用户发过来的图片,微信公众平台支持接收图片,一条图片消息的格式如下: <xml> <ToUserName><![CDATA[gh_13d1a3a7

【Win10 应用开发】OCR识别

原文:[Win10 应用开发]OCR识别 OCR,即Optical Character Recognition,光学字符识别.以下介绍来自搜索: OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程:即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软

网易邮箱人脸识别系统:有“脸”更安全

不只有<碟中谍4>中的汤姆·克鲁斯才能耍酷.网易人脸识别系统首先用于邮箱产品,以后登录邮箱你可以耍酷,通过扫描脸部登录邮箱.目前该应用开始公测,公测阶段,网易邮箱公开招募6000名网易邮箱用户优先试用,对网络新应用时刻关注的笔者,有幸通过网易手机号码邮箱申请获得体验权. 评测环境 时间:6月8日15:00-16:00 软件:Chrome浏览器最新版本 邮箱:网易126免费邮 硬件:戴尔XPS L502X 集成摄像头 系统:Windows XP 前期准备: 申请测试权.用户可以在页面或在网易免费