private async void ProcessCurrentVideoFrame(DispatcherTimer timer) { if (captureManager.CameraStreamState != Windows.Media.Devices.CameraStreamState.Streaming) { return; } if (!await frameProcessingSemaphore.WaitAsync(250)) { return; } try { IEnumerable <DetectedFace> faces = null; // Create a VideoFrame object specifying the pixel format we want our capture image to be (NV12 bitmap in this case). // GetPreviewFrame will convert the native webcam frame into this format. const BitmapPixelFormat InputPixelFormat = BitmapPixelFormat.Nv12; using (VideoFrame previewFrame = new VideoFrame(InputPixelFormat, (int)this.videoProperties.Width, (int)this.videoProperties.Height)) { await this.captureManager.GetPreviewFrameAsync(previewFrame); // The returned VideoFrame should be in the supported NV12 format but we need to verify this. if (FaceDetector.IsBitmapPixelFormatSupported(previewFrame.SoftwareBitmap.BitmapPixelFormat)) { faces = await this.faceTracker.ProcessNextFrameAsync(previewFrame); if (this.FilterOutSmallFaces) { // We filter out small faces here. faces = faces.Where(f => CoreUtil.IsFaceBigEnoughForDetection((int)f.FaceBox.Height, (int)this.videoProperties.Height)); } this.NumFacesOnLastFrame = faces.Count(); if (this.EnableAutoCaptureMode) { this.UpdateAutoCaptureState(faces); } // Create our visualization using the frame dimensions and face results but run it on the UI thread. var previewFrameSize = new Windows.Foundation.Size(previewFrame.SoftwareBitmap.PixelWidth, previewFrame.SoftwareBitmap.PixelHeight); var ignored = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { this.ShowFaceTrackingVisualization(previewFrameSize, faces); }); } } } catch (Exception x) { Debug.WriteLine(x.Message); } finally { frameProcessingSemaphore.Release(); } }
private async void ProcessCurrentVideoFrame(ThreadPoolTimer timer) { if (captureManager.CameraStreamState != CameraStreamState.Streaming || !frameProcessingSemaphore.Wait(0)) { return; } try { IEnumerable <DetectedFace> faces = null; // Create a VideoFrame object specifying the pixel format we want our capture image to be (NV12 bitmap in this case). // GetPreviewFrame will convert the native webcam frame into this format. const BitmapPixelFormat InputPixelFormat = BitmapPixelFormat.Nv12; using (VideoFrame currentFrame = new VideoFrame(InputPixelFormat, (int)videoProperties.Width, (int)videoProperties.Height)) { await captureManager.GetPreviewFrameAsync(currentFrame); // The returned VideoFrame should be in the supported NV12 format but we need to verify this. if (FaceDetector.IsBitmapPixelFormatSupported(currentFrame.SoftwareBitmap.BitmapPixelFormat)) { faces = await faceTracker.ProcessNextFrameAsync(currentFrame); if (FilterOutSmallFaces) { // We filter out small faces here. faces = faces.Where(f => CoreUtil.IsFaceBigEnoughForDetection((int)f.FaceBox.Height, (int)videoProperties.Height)); } NumFacesOnLastFrame = faces.Count(); if (EnableAutoCaptureMode) { UpdateAutoCaptureState(faces); } // Create our visualization using the frame dimensions and face results but run it on the UI thread. var currentFrameSize = new Windows.Foundation.Size(currentFrame.SoftwareBitmap.PixelWidth, currentFrame.SoftwareBitmap.PixelHeight); var rgbaBitmap = SoftwareBitmap.Convert(currentFrame.SoftwareBitmap, BitmapPixelFormat.Rgba8); HandleFaces(currentFrameSize, faces, rgbaBitmap); } } } catch (Exception) { } finally { frameProcessingSemaphore.Release(); } }
private async void ProcessCurrentVideoFrame(ThreadPoolTimer timer) { if (captureManager.CameraStreamState != Windows.Media.Devices.CameraStreamState.Streaming || !frameProcessingSemaphore.Wait(0)) { return; } try { IEnumerable <DetectedFace> faces = null; const BitmapPixelFormat InputPixelFormat = BitmapPixelFormat.Nv12; using (VideoFrame previewFrame = new VideoFrame(InputPixelFormat, (int)this.videoProperties.Width, (int)this.videoProperties.Height)) { await this.captureManager.GetPreviewFrameAsync(previewFrame); if (FaceDetector.IsBitmapPixelFormatSupported(previewFrame.SoftwareBitmap.BitmapPixelFormat)) { faces = await this.faceTracker.ProcessNextFrameAsync(previewFrame); if (this.FilterOutSmallFaces) { faces = faces.Where(f => CoreUtil.IsFaceBigEnoughForDetection((int)f.FaceBox.Height, (int)this.videoProperties.Height)); } this.NumFacesOnLastFrame = faces.Count(); if (this.EnableAutoCaptureMode) { this.UpdateAutoCaptureState(faces); } var previewFrameSize = new Windows.Foundation.Size(previewFrame.SoftwareBitmap.PixelWidth, previewFrame.SoftwareBitmap.PixelHeight); var ignored = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { this.ShowFaceTrackingVisualization(previewFrameSize, faces); }); } } } catch (Exception) { } finally { frameProcessingSemaphore.Release(); } }