private async Task Capture() { if (_waiting) { return; } Stream imageStream = await _camera.CaptureImageAsync(); if (imageStream == null) { Log("Capture failed."); return; } MemoryStream bitmapStream = new MemoryStream(); imageStream.CopyTo(bitmapStream); SoftwareBitmap image = await _camera.ConvertStreamToBitmap(bitmapStream); SoftwareBitmap convertedImage = SoftwareBitmap.Convert(image, BitmapPixelFormat.Nv12); if (!FaceDetector.IsBitmapPixelFormatSupported(convertedImage.BitmapPixelFormat)) { Log($"Unsupported pixel format! ({convertedImage.BitmapPixelFormat})"); return; } await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { var imgSrc = new SoftwareBitmapSource(); await imgSrc.SetBitmapAsync(image); imgCapture.Source = imgSrc; }); var fd = await FaceDetector.CreateAsync(); var faces = await fd.DetectFacesAsync(convertedImage); if (faces.Count == 0) { // no faces, nothing to do Log("No faces detected.", false); return; } Log($"{faces.Count} faces.", false); _waiting = true; // block any other processing if (_config.EnableUpload) { // face detected locally, send to Storage imageStream.Seek(0, SeekOrigin.Begin); string fileName = await StorageService.UploadImageAsync(imageStream); Log($"Sent to processing."); int serverFacesDetected; while ((serverFacesDetected = await CheckService.FacesDetectedAsync(fileName)) == -1) { await Task.Delay(TimeSpan.FromSeconds(2)); } if (serverFacesDetected > 0) { // something detected on server, activate delay Log($"Faces found on server. Waiting {_vm.Delay} seconds."); await Task.Delay(TimeSpan.FromSeconds(_vm.Delay)); } else { Log("No faces found on server. Skipping delay."); } } imageStream.Dispose(); bitmapStream.Dispose(); _waiting = false; }