Ręczne kontrolki aparatu do przechwytywania wideo
W tym artykule pokazano, jak używać ręcznych kontrolek urządzeń w celu włączenia rozszerzonych scenariuszy przechwytywania wideo, w tym wideo HDR i priorytetu ekspozycji.
Kontrolki urządzeń wideo omówione w tym artykule są dodawane do aplikacji przy użyciu tego samego wzorca. Najpierw sprawdź, czy kontrolka jest obsługiwana na bieżącym urządzeniu, na którym działa aplikacja. Jeśli kontrolka jest obsługiwana, ustaw żądany tryb dla kontrolki. Zazwyczaj jeśli określona kontrolka nie jest obsługiwana na bieżącym urządzeniu, należy wyłączyć lub ukryć element interfejsu użytkownika, który umożliwia użytkownikowi włączenie tej funkcji.
Notatka
Ten artykuł opiera się na pojęciach i kodzie omówionych w Podstawowe zdjęcia, wideo i przechwytywanie audio za pomocą programu MediaCapture, w którym opisano kroki implementowania podstawowych zdjęć i przechwytywania wideo. Zalecamy zapoznanie się z podstawowym wzorcem przechwytywania multimediów w tym artykule przed przejściem do bardziej zaawansowanych scenariuszy przechwytywania. W kodzie w tym artykule przyjęto założenie, że aplikacja ma już wystąpienie MediaCapture, które zostało prawidłowo zainicjowane.
WIDEO HDR
Funkcja wideo o wysokim zakresie dynamicznym (HDR) stosuje przetwarzanie HDR do strumienia wideo urządzenia przechwytywania. Określ, czy wideo HDR jest obsługiwane, wybierając właściwość HdrVideoControl.Supported.
Kontrolka wideo HDR obsługuje trzy tryby: włączone, wyłączone i automatyczne, co oznacza, że urządzenie dynamicznie określa, czy przetwarzanie wideo HDR poprawi przechwytywanie multimediów, a jeśli tak, włącza wideo HDR. Aby ustalić, czy dany tryb jest obsługiwany na bieżącym urządzeniu, sprawdź, czy kolekcja
Włącz lub wyłącz przetwarzanie wideo HDR, ustawiając HdrVideoControl.Mode na żądany tryb. Ta kontrolka wymaga, aby strumień był w stanie zatrzymanym przed ustawieniem trybu, zobacz KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.
private void SetHdrVideoMode(HdrVideoMode mode)
{
if (!m_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
{
tbStatus.Text = "HDR Video not available";
return;
}
var hdrVideoModes = m_mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;
if (!hdrVideoModes.Contains(mode))
{
tbStatus.Text = "HDR Video setting not supported";
return;
}
m_mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}
Priorytet ekspozycji
ExposurePriorityVideoControl, po włączeniu, ocenia klatki wideo z urządzenia przechwytywania w celu określenia, czy wideo przechwytuje scenę o niskiej świetlości. Jeśli tak, kontrolka obniża szybkość klatek przechwyconego wideo, aby zwiększyć czas ekspozycji dla każdej ramki i poprawić jakość wizualizacji przechwyconego wideo.
Ustal, czy kontrolka priorytetu ekspozycji jest obsługiwana na bieżącym urządzeniu, sprawdzając właściwość ExposurePriorityVideoControl.Supported.
Włącz lub wyłącz kontrolkę priorytetu ekspozycji, ustawiając ExposurePriorityVideoControl.Enabled do żądanego trybu.
if (!m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
tbStatus.Text = "Exposure priority not available";
return;
}
m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;
Denoizacja czasowa
Począwszy od systemu Windows 10 w wersji 1803, można włączyć czasowe denozowanie wideo na urządzeniach, które go obsługują. Ta funkcja łączy dane obrazu z wielu sąsiednich ramek w czasie rzeczywistym w celu utworzenia ramek wideo, które mają mniej szumu wizualnego.
VideoTemporalDenoisingControl umożliwia aplikacji określenie, czy tymczasowe denozowanie jest obsługiwane na bieżącym urządzeniu, a jeśli tak, które tryby denozowania są obsługiwane. Dostępne tryby denozowania to Off, Oni Auto. Urządzenie może nie obsługiwać wszystkich trybów, ale każde urządzenie musi obsługiwać Auto lub On i Off.
W poniższym przykładzie korzystamy z prostego interfejsu użytkownika, który udostępnia przyciski radiowe, umożliwiające użytkownikowi przełączanie się między trybami usuwania szumów.
<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
<StackPanel x:Name="spDenoise" Visibility="Collapsed">
<TextBlock>Temporal Denoising</TextBlock>
<RadioButton x:Name="rbDenoiseOff" Checked="rbDenoise_Checked"
GroupName="Denoise Group" Content="Off"/>
<RadioButton x:Name="rbDenoiseOn" Checked="rbDenoise_Checked"
GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
<RadioButton x:Name="rbDenoiseAuto" Checked="rbDenoise_Checked"
GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
</StackPanel>
</StackPanel>
W poniższej metodzie jest sprawdzana właściwość VideoTemporalDenoisingControl.Supported, aby sprawdzić, czy usuwanie szumów czasowych jest w ogóle obsługiwane na bieżącym urządzeniu. Jeśli tak, sprawdzamy, czy Wyłączone oraz Automatyczne lub Włączone są obsługiwane; w takim przypadku nasze przyciski radiowe stają się widoczne. Następnie przyciski Auto i Włączone są widoczne, jeśli te metody są obsługiwane.
private void bUpdateDenoiseCapabilities_Click(object sender, RoutedEventArgs e)
{
if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
{
IReadOnlyList<VideoTemporalDenoisingMode> modes = m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes;
if(modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off) &&
(modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On) ||
modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto)))
{
spDenoise.Visibility = Visibility.Visible;
if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
{
rbDenoiseOn.Visibility = Visibility.Visible;
}
if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
{
rbDenoiseAuto.Visibility = Visibility.Visible;
}
}
}
}
W programie obsługi zdarzeń sprawdzonym przycisków radiowych jest zaznaczona nazwa przycisku, a odpowiedni tryb jest ustawiany przez ustawienie właściwości VideoTemporalDenoisingControl.Mode.
private void rbDenoise_Checked(object sender, RoutedEventArgs e)
{
var button = sender as RadioButton;
if(button.Name == "denoiseOffButton")
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
else if (button.Name == "denoiseOnButton")
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
}
else if (button.Name == "denoiseAutoButton")
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
}
}
Wyłączanie denozowania czasowego podczas przetwarzania ramek
Wideo, które zostało przetworzone przy użyciu denoizacji czasowej, może być bardziej miłe dla ludzkiego oka. Jednak ze względu na to, że tymczasowe denozowanie może mieć wpływ na spójność obrazu i zmniejszyć ilość szczegółów w ramce, aplikacje wykonujące przetwarzanie obrazów na ramkach, takie jak rejestracja lub optyczne rozpoznawanie znaków, mogą chcieć programowo wyłączyć denozowanie podczas włączania przetwarzania obrazów.
Poniższy przykład określa, które tryby denoizacji są obsługiwane i przechowuje te informacje w niektórych zmiennych klasy.
private bool _isVideoTemporalDenoisingOffSupported = false;
private bool _isProcessing = false;
private Windows.Media.Devices.VideoTemporalDenoisingMode? _videoDenoisingEnabledMode = null;
private void ConfigureDenoiseForFrameProcessing()
{
if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
{
// Query support for the VideoTemporalDenoising control Off mode
_isVideoTemporalDenoisingOffSupported = m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Off);
// Query support for a mode that would enable VideoTemporalDenoising (On or Auto) and toggle it if supported
if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
{
_videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
}
else if (m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
{
_videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
}
}
}
Gdy aplikacja włącza przetwarzanie ramek, ustawia tryb redukcji szumów na Wyłączony, jeśli ten tryb jest obsługiwany, aby przetwarzanie ramek mogło używać surowych ramek, które nie zostały poddane redukcji szumów.
public void EnableFrameProcessing()
{
// Toggle Off VideoTemporalDenoising
if (_isVideoTemporalDenoisingOffSupported)
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
_isProcessing = true;
}
Gdy aplikacja wyłączy przetwarzanie ramek, ustawia tryb denoizacji na w lub Automatyczne, w zależności od tego, który tryb jest obsługiwany.
public void DisableFrameProcessing()
{
_isProcessing = false;
// If a VideoTemporalDenoising mode to enable VideoTemporalDenoising is supported, toggle it
if (_videoDenoisingEnabledMode != null)
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
}
}
Aby uzyskać więcej informacji na temat uzyskiwania ramek wideo do przetwarzania obrazów, zobacz Przetwarzanie ramek mediów za pomocą MediaFrameReader.