この記事では、手動のデバイス コントロールを使用して、HDR ビデオや露出の優先順位など、強化されたビデオ キャプチャ シナリオを有効にする方法について説明します。
この記事で説明するビデオ デバイス コントロールはすべて、同じパターンを使用してアプリに追加されます。 まず、アプリが実行されている現在のデバイスでコントロールがサポートされているかどうかを確認します。 コントロールがサポートされている場合は、コントロールの目的のモードを設定します。 通常、特定のコントロールが現在のデバイスでサポートされていない場合は、ユーザーが機能を有効にできるようにする UI 要素を無効または非表示にする必要があります。
注
この記事は、MediaCapture を使用した 基本的な写真、ビデオ、オーディオ キャプチャで説明されている概念とコードに基づいています。ここでは、基本的な写真とビデオのキャプチャを実装する手順について説明します。 より高度なキャプチャ シナリオに進む前に、その記事の基本的なメディア キャプチャ パターンを理解することをお勧めします。 この記事のコードでは、アプリに、適切に初期化された MediaCapture のインスタンスが既に存在することを前提としています。
HDR ビデオ
ハイ ダイナミック レンジ (HDR) ビデオ機能は、キャプチャ デバイスのビデオ ストリームに HDR 処理を適用します。 HdrVideoControl.Supported プロパティを選択して、HDR ビデオがサポートされているかどうかを確認します。
HDR ビデオ コントロールは、オン、オフ、自動の 3 つのモードをサポートしています。つまり、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 を使用すると、アプリは現在のデバイスで一時的なノイズ除去がサポートされているかどうかを判断でき、サポートされている場合は、どのノイズ除去モードがサポートされているかを判断できます。 使用可能なノイズ除去モードは Off、 On、 Auto です。デバイスはすべてのモードをサポートしているわけではありませんが、すべてのデバイスで 自動 または オン / オフをサポートする必要があります。
次の例では、単純な UI を使用してラジオ ボタンを提供し、ユーザーがノイズ除去モードを切り替えることができます。
<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 プロパティがチェックされ、現在のデバイスで一時的なノイズ除去がサポートされているかどうかを確認します。 その場合は、 オフ と 自動 または オン がサポートされていることを確認します。その場合は、ラジオ ボタンが表示されます。 次に、これらのメソッドがサポートされている場合は、[ 自動 ] ボタンと [オン] ボタンが表示されます。
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;
}
}
}
}
ラジオ ボタンの Checked イベント ハンドラーで、ボタンの名前がチェックされ、 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;
}
}
}
アプリでフレーム処理を有効にすると、そのモードがサポートされている場合は、ノイズ除去モードが Off に設定され、ノイズ除去されていない生フレームをフレーム処理で使用できるようになります。
public void EnableFrameProcessing()
{
// Toggle Off VideoTemporalDenoising
if (_isVideoTemporalDenoisingOffSupported)
{
m_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
}
_isProcessing = true;
}
アプリは、フレーム処理を無効にすると、サポートされているモードに応じて、ノイズ除去モードを On または Auto に設定します。
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 を使用したメディア フレームの処理」を参照してください。
関連トピック
- カメラ
- MediaCapture を使用して、基本的な写真、ビデオ、およびオーディオをキャプチャする
- MediaFrameReader を使用してメディア フレームを処理する
- VideoTemporalDenoisingControl
Windows developer