/// <summary> /// Triggered when UIButtonFilePick is clicked, grabs a frame from an image file. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void UIButtonFilePick_Click(object sender, RoutedEventArgs e) { // Stop Camera preview UICameraPreview.Stop(); if (UICameraPreview.CameraHelper != null) { await UICameraPreview.CameraHelper.CleanUpAsync(); } UICameraPreview.Visibility = Visibility.Collapsed; UIImageViewer.Visibility = Visibility.Visible; // Disable subsequent trigger of this event callback UICameraToggle.IsEnabled = false; UIButtonFilePick.IsEnabled = false; await m_lock.WaitAsync(); try { // Initialize skill with the selected supported device m_skeletalDetectorSkill = await m_skeletalDetectorDescriptor.CreateSkillAsync(m_availableExecutionDevices[UISkillExecutionDevices.SelectedIndex]) as SkeletalDetectorSkill; // Instantiate a binding object that will hold the skill's input and output resource m_skeletalDetectorBinding = await m_skeletalDetectorSkill.CreateSkillBindingAsync() as SkeletalDetectorBinding; var frame = await LoadVideoFrameFromFilePickedAsync(); if (frame != null) { SoftwareBitmapSource source = new SoftwareBitmapSource(); await source.SetBitmapAsync(frame.SoftwareBitmap); UIImageViewer.Source = source; UIImageViewer_SizeChanged(null, null); await RunSkillAsync(frame, false); } m_skeletalDetectorSkill = null; m_skeletalDetectorBinding = null; m_currentFrameSourceToggled = FrameSourceToggledType.ImageFile; } catch (Exception ex) { await(new MessageDialog(ex.Message)).ShowAsync(); m_currentFrameSourceToggled = FrameSourceToggledType.None; } m_lock.Release(); // Enable subsequent trigger of this event callback UIButtonFilePick.IsEnabled = true; UICameraToggle.IsEnabled = true; }
/// <summary> /// Initialize the SkeletalDetector skill and binding instances /// </summary> /// <param name="device"></param> /// <returns></returns> private async Task InitializeSkeletalDetectorAsync(ISkillExecutionDevice device = null) { if (device != null) { m_skill = await m_descriptor.CreateSkillAsync(device) as SkeletalDetectorSkill; } else { m_skill = await m_descriptor.CreateSkillAsync() as SkeletalDetectorSkill; } m_binding = await m_skill.CreateSkillBindingAsync() as SkeletalDetectorBinding; }
private async void CameraHelper_FrameArrived(object sender, FrameEventArgs e) { await m_lock.WaitAsync(); try { // Use a lock to process frames one at a time and bypass processing if busy if (m_lock.Wait(0)) { uint cameraFrameWidth = UICameraPreview.CameraHelper.PreviewFrameSource.CurrentFormat.VideoFormat.Width; uint cameraFrameHeight = UICameraPreview.CameraHelper.PreviewFrameSource.CurrentFormat.VideoFormat.Height; // Allign overlay canvas and camera preview so that face detection rectangle looks right if (!m_isCameraFrameDimensionInitialized || cameraFrameWidth != m_cameraFrameWidth || cameraFrameHeight != m_cameraFrameHeight) { // Can't bind frames of different sizes to same binding. // As a workaround, recreate the binding for each eval if framesize changed. m_skeletalDetectorBinding = await m_skeletalDetectorSkill.CreateSkillBindingAsync() as SkeletalDetectorBinding; m_cameraFrameWidth = UICameraPreview.CameraHelper.PreviewFrameSource.CurrentFormat.VideoFormat.Width; m_cameraFrameHeight = UICameraPreview.CameraHelper.PreviewFrameSource.CurrentFormat.VideoFormat.Height; await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { UIImageViewer_SizeChanged(null, null); }); m_isCameraFrameDimensionInitialized = true; } // Run the skill against the frame SoftwareBitmap copyBitmap = SoftwareBitmap.Convert(e.VideoFrame.SoftwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); m_cachedFrame = VideoFrame.CreateWithSoftwareBitmap(copyBitmap); await RunSkillAsync(m_cachedFrame, true); m_lock.Release(); } e.VideoFrame.Dispose(); } catch (Exception ex) { // Show the error await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => UISkillOutputDetails.Text = ex.Message); m_lock.Release(); } finally { m_lock.Release(); } }
/// <summary> /// Initialize the SkeletalDetector skill and binding instances /// </summary> /// <param name="device"></param> /// <returns></returns> private async Task InitializeSkeletalDetectorAsync(ISkillExecutionDevice device = null) { if (device != null) { m_skill = await m_descriptor.CreateSkillAsync(device) as SkeletalDetectorSkill; } else { m_skill = await m_descriptor.CreateSkillAsync() as SkeletalDetectorSkill; } m_binding = await m_skill.CreateSkillBindingAsync() as SkeletalDetectorBinding; m_inputImageFeatureDescriptor = m_binding["InputImage"].Descriptor as SkillFeatureImageDescriptor; }