以前作微軟編程之美的時候接觸了下微軟認知服務相應的api,但沒有仔細研究。最近在作計算機視覺相關的內容,正好順着文檔寫了一個demo。編程
人臉識別API:https://www.azure.cn/cognitive-services/zh-cn/face-apijson
能夠用你的微軟帳號申請免費試用,申請以後會獲得相應的密鑰。c#
我使用的平臺是Visual Studio 2013,而不是文檔中要求的Visual Studio 2015。使用的語言是C#,用WPF搭建一個簡單的界面。api
在WPF下加入以下結構:async
<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,分別安裝。this
在MainWindow.xaml.cs中:
添加你的密鑰:spa
private readonly IFaceServiceClient faceServiceClient = new FaceServiceClient("你的密鑰");
編寫對上傳照片檢測人臉的代碼,以下:code
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關鍵字,以下:orm
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; } }
初始界面:
blog
打開照片:
圖片來源:網上搜索
檢測結果:
能夠看到有兩我的臉並無很好地識別出來,具體的參數是能夠獲取到的,須要進一步研究。