視訊擷取的手動相機控件
本文說明如何使用手動裝置控件來啟用增強的視訊擷取案例,包括 HDR 視訊和曝光優先順序。
本文所討論的影片裝置控件全都會使用相同的模式新增至您的應用程式。 首先,請檢查您的應用程式執行所在的目前裝置是否支援控制項。 如果支援控制項,請設定控制項所需的模式。 一般而言,如果目前裝置不支援特定控件,您應該停用或隱藏允許使用者啟用功能的UI元素。
注意
本文以 使用 MediaCapture中討論的基本相片、視訊和音訊擷取中討論的概念和程式代碼為基礎,其中說明實作基本相片和視訊擷取的步驟。 建議您先熟悉該文章中的基本媒體擷取模式,再繼續進行更進階的擷取案例。 本文中的程式代碼假設您的應用程式已經有已正確初始化的 MediaCapture 實例。
HDR 影片
高動態範圍 (HDR) 視訊功能會將 HDR 處理套用至擷取裝置的視訊數據流。 選取 HdrVideoControl.Supported 屬性,以判斷是否支援 HDR 視訊。
HDR 視訊控件支援三種模式:開啟、關閉和自動,這表示裝置會動態判斷 HDR 視訊處理是否會改善媒體擷取,如果是的話,會啟用 HDR 視訊。 若要判斷目前裝置上是否支援特定模式,請檢查 HdrVideoControl.SupportedModes 集合是否包含所需的模式。
將 HdrVideoControl. Mode 設定為所需的模式,以啟用或停用 HDR 視訊處理。 此控制要求串流在設定模式之前處於已停止狀態,請參閱 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;
}
曝光優先順序
ExposurePriorityVideoControl啟用時,會評估擷取裝置中的視訊畫面,以判斷影片是否正在擷取低光場景。 如果是,控件會降低所擷取視訊的幀速率,以增加每個畫面的曝光時間,並改善所擷取視訊的視覺品質。
檢查 ExposurePriorityVideoControl.Supported 屬性,判斷目前裝置是否支援曝光優先順序控件。
將 ExposurePriorityVideoControl.Enabled 設定為所需模式,以啟用或停用曝光優先順序控件。
if (!m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
tbStatus.Text = "Exposure priority not available";
return;
}
m_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;
時態性去雜訊
從 Windows 10 版本 1803 開始,您可以在支援此功能的裝置上為視訊啟用時間去噪。 這項功能會即時將來自多個相鄰畫面的影像數據融合在一起,以產生較少視覺雜訊畫面。
VideoTemporalDenoisingControl 可讓您的應用程式判斷目前裝置是否支援時態取消雜訊,如果是的話,則支援哪些取消雜訊模式。 可用的去噪模式包括 關閉、開啟和 自動。裝置可能不支援所有模式,但每個裝置都必須支援 自動 或 開啟 以及 關閉。
下列範例會使用簡單的使用者介面來提供單選按鈕,讓使用者在去噪模式之間切換。
<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>
在下列方法中,會檢查 VideoTemporalDenoisingControl.Supported 屬性,以查看目前裝置上是否完全支援時態去雜訊。 若是如此,我們會檢查以確定是否支援 關閉 和 自動 或 開啟,在這種情況下,我們會顯示我們的單選按鈕。 接下來,如果支援這些方法,Auto 和 On 按鈕會顯示。
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;
}
}
}
}
在單選按鈕的 核取 事件處理程式中,會先檢查按鈕的名稱,再通過設定 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;
}
}
在處理影格時停用時間去噪
使用時間去噪處理的影片可能對人眼更吸引人。 不過,由於時間性的降噪可能會影響影像的一致性,並減少畫面中的細節,因此在畫面中執行影像處理的應用程式,例如圖像配準或光學字元辨識,可能會想要在啟用影像處理時以程式方式停用降噪。
下列範例會決定支援哪些降噪模式,並將這項資訊儲存在一些類別屬性中。
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;
}
}
}
當應用程式啟用畫面處理時,如果支援該模式,它會將去噪模式設定為 關閉,以便框架處理可以使用尚未去噪的原始畫格。
public void EnableFrameProcessing()
{
// Toggle Off VideoTemporalDenoising
if (_isVideoTemporalDenoisingOffSupported)
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
_isProcessing = true;
}
當應用程式停用畫面處理時,它會將去噪模式設定為 [開啟] 或 [自動],這取決於支援的模式。
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;
}
}
如需取得影像處理視訊畫面的詳細資訊,請參閱 使用 MediaFrameReader 處理媒體畫面。