微软认知服务——人脸识别
2016-06-20 17:54
232 查看
微软认知服务——人脸识别
之前做微软编程之美的时候接触了下微软认知服务相应的api,但没有仔细研究。最近在做计算机视觉相关的内容,正好顺着文档写了一个demo。申请API
人脸识别API:https://www.azure.cn/cognitive-services/zh-cn/face-api可以用你的微软账号申请免费试用,申请之后会得到相应的密钥。
搭建demo
我使用的平台是Visual Studio 2013,而不是文档中要求的Visual Studio 2015。使用的语言是C#,用WPF搭建一个简单的界面。在WPF下加入如下结构:
<Grid x:Name="BackPanel"> <Image x:Name="FacePhoto" Stretch="Uniform" Margin="0,0,0,30"/> <Button x:Name="BrowseButton" Margin="20,5" Height="20" VerticalAlignment="Bottom" Content="Browse..." Click="BrowseButton_Click"/> </Grid>
在解决方案资源管理器中右键你的解决方案名称,打开管理NuGet程序包,搜索Netonsoft.json和Microsoft.ProjectOxford.Face,分别安装。
在MainWindow.xaml.cs中:
添加你的密钥:
private readonly IFaceServiceClient faceServiceClient = new FaceServiceClient("你的密钥");
编写对上传照片检测人脸的代码,如下:
private async Task<FaceRectangle[]> UploadAndDetectFaces(string imageFilePath) { try { using (Stream imageFileStream = File.OpenRead(imageFilePath)) { var faces = await faceServiceClient.DetectAsync(imageFileStream); var faceRects = faces.Select(face => face.FaceRectangle); return faceRects.ToArray(); } } catch (Exception) { return new FaceRectangle[0]; } }
添加button的Click事件,并添加async关键字,如下:
private async void BrowseButton_Click(object sender, RoutedEventArgs e) { var openDlg = new Microsoft.Win32.OpenFileDialog(); openDlg.Filter = "JPEG Image(*.jpg)|*.jpg"; bool? result = openDlg.ShowDialog(this); if (!(bool)result) { return; } string filePath = openDlg.FileName; Uri fileUri = new Uri(filePath); BitmapImage bitmapSource = new BitmapImage(); bitmapSource.BeginInit(); bitmapSource.CacheOption = BitmapCacheOption.None; bitmapSource.UriSource = fileUri; bitmapSource.EndInit(); FacePhoto.Source = bitmapSource; Title = "Detecting..."; FaceRectangle[] faceRects = await UploadAndDetectFaces(filePath); Title = String.Format("Detection Finished. {0} face(s) detected", faceRects.Length); if (faceRects.Length > 0) { DrawingVisual visual = new DrawingVisual(); DrawingContext drawingContext = visual.RenderOpen(); drawingContext.DrawImage(bitmapSource, new Rect(0, 0, bitmapSource.Width, bitmapSource.Height)); double dpi = bitmapSource.DpiX; double resizeFactor = 96 / dpi; foreach (var faceRect in faceRects) { drawingContext.DrawRectangle( Brushes.Transparent, new Pen(Brushes.Red, 2), new Rect( faceRect.Left * resizeFactor, faceRect.Top * resizeFactor, faceRect.Width * resizeFactor, faceRect.Height * resizeFactor ) ); } drawingContext.Close(); RenderTargetBitmap faceWithRectBitmap = new RenderTargetBitmap( (int)(bitmapSource.PixelWidth * resizeFactor), (int)(bitmapSource.PixelHeight * resizeFactor), 96, 96, PixelFormats.Pbgra32); faceWithRectBitmap.Render(visual); FacePhoto.Source = faceWithRectBitmap; } }
运行结果
初始界面:打开照片:
图片来源:网上搜索
检测结果:
可以看到有两个人脸并没有很好地识别出来,具体的参数是可以获取到的,需要进一步研究。
相关文章推荐
- 第一篇博客,JAVA初学心得,Static
- Android应用开发:图形绘制之硬件加速
- Linux网络流量实时监控ifstat iftop命令详解
- 浅谈HTTPS传输协议原理
- [代码实例][C语言]读取文本文件
- Springmvc层架构
- RNN学习(二) 一些常见的RNN
- 关于我使用htmlparser,以及通过htmllparse下载网页中的图片
- Python问题集锦
- 用联合体获取类成员函数地址
- Private information retrieval
- java生成execl下拉列表
- java InputStreamheOutputStream的用法讲义
- rop 异常处理
- java生成32位的UUID通用唯一识别码 (Universally Unique Identifier)
- 【java细节】Java用HttpURLConnection实现Http、restful请求
- c语言第三次作业
- redis过期处理机制
- eclipse控制台中文乱码
- 2.0、Android Studio编写你的应用