Example #1
0
        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;
        }