비디오 캡처를 위한 수동 카메라 컨트롤

이 문서는 수동 디바이스 컨트롤을 사용하여 HDR 비디오 및 노출 우선 순위를 비롯한 향상된 비디오 캡처 시나리오를 사용하도록 설정하는 방법을 보여줍니다.

이 문서에서 설명하는 비디오 디바이스 컨트롤은 모두 동일한 패턴을 사용하여 앱에 추가됩니다. 먼저 검사 앱이 실행 중인 현재 디바이스에서 컨트롤이 지원되는지 확인합니다. 컨트롤이 지원되는 경우 컨트롤에 대해 원하는 모드를 설정합니다. 일반적으로 특정 컨트롤이 현재 디바이스에서 지원되지 않는 경우 사용자가 기능을 사용하도록 설정할 수 있는 UI 요소를 사용하지 않도록 설정하거나 숨겨야 합니다.

이 문서에서 설명하는 모든 디바이스 제어 API는 Windows.Media.Devices 네임스페이스의 멤버입니다.

using Windows.Media.Devices;

참고 항목

이 문서는 기본 사진 및 비디오 캡처 구현 단계를 설명하는 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 (!_mediaCapture.VideoDeviceController.HdrVideoControl.Supported)
    {
        ShowMessageToUser("HDR Video not available");
        return;
    }

    var hdrVideoModes = _mediaCapture.VideoDeviceController.HdrVideoControl.SupportedModes;

    if (!hdrVideoModes.Contains(mode))
    {
        ShowMessageToUser("HDR Video setting not supported");
        return;
    }

    _mediaCapture.VideoDeviceController.HdrVideoControl.Mode = mode;
}

노출 우선 순위

ExposurePriorityVideoControl을 사용하도록 설정하면 캡처 디바이스의 비디오 프레임을 평가하여 비디오가 저조도 장면을 캡처하는지 확인합니다. 이 경우 컨트롤은 각 프레임에 대한 노출 시간을 늘리고 캡처된 비디오의 시각적 품질을 개선하기 위해 캡처된 비디오의 프레임 속도를 낮춥니다.

ExposurePriorityVideoControl.Supported 속성을 검사 현재 디바이스에서 노출 우선 순위 컨트롤이 지원되는지 확인합니다.

ExposurePriorityVideoControl.Enabled를 원하는 모드로 설정하여 노출 우선 순위 제어를 사용하거나 사용하지 않도록 설정합니다.

if (!_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Supported)
{
    ShowMessageToUser("Exposure priority not available");
    return;
}
_mediaCapture.VideoDeviceController.ExposurePriorityVideoControl.Enabled = true;

임시 디노이징

Windows 10, 버전 1803부터는 비디오를 지원하는 디바이스에서 비디오를 일시적으로 디노이징할 수 있습니다. 이 기능은 실시간으로 여러 인접 프레임의 이미지 데이터를 융합하여 시각적 노이즈가 적은 비디오 프레임을 생성합니다.

VideoTemporalDenoisingControl을 통해 앱은 현재 디바이스에서 임시 디노이징 기능이 지원되는지 확인할 수 있고 그럴 경우 지원되는 디노이징 모드를 확인할 수 있습니다. 사용 가능한 디노이징 모드는 Off, On, Auto입니다. 디바이스에서 모든 모드를 지원하지 않을 수 있지만, 모든 디바이스는 Auto 또는 OnOff를 지원해야 합니다.

다음 예제에서는 간단한 UI를 사용하여 사용자가 다른 디노이징 모드로 전환할 수 있는 라디오 버튼을 제공합니다.

<StackPanel Orientation="Vertical" HorizontalAlignment="Right" >
    <StackPanel x:Name="denoiseControls" Visibility="Collapsed">
        <TextBlock>Temporal Denoising</TextBlock>
        <RadioButton x:Name="denoiseOffButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="Off"/>
        <RadioButton x:Name="denoiseOnButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="On" Visibility="Collapsed"/>
        <RadioButton x:Name="denoiseAutoButton" Checked="denoiseButton_Checked"
    GroupName="Denoise Group" Content="Auto" Visibility="Collapsed"/>
    </StackPanel>
</StackPanel>

다음 메서드에서 VideoTemporalDenoisingControl.Supported 속성을 확인하여 임시 디노이징이 현재 디바이스에서 지원되고 있는지 확인할 수 있습니다. 지원되는 경우, OffAuto 또는 On이 지원되는지 확인하고 이 경우에 라디오 단추가 표시되는지도 확인합니다. 그 다음 이 메서드가 지원되면 AutoOn 단추가 표시되도록 합니다.

private void UpdateDenoiseCapabilities()
{
    if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
         IReadOnlyList<VideoTemporalDenoisingMode> modes = _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)))
        {
            denoiseControls.Visibility = Visibility.Visible;

            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
            {
                denoiseOnButton.Visibility = Visibility.Visible;
            }
            if (modes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
            {
                denoiseAutoButton.Visibility = Visibility.Visible;
            }
        }
    }
}

라디오 단추의 Checked 이벤트 처리기에서 이 단추의 이름을 확인하고 VideoTemporalDenoisingControl.Mode 속성을 설정하여 해당 모드를 설정합니다.

private void denoiseButton_Checked(object sender, RoutedEventArgs e)
{
    var button = sender as RadioButton;
    if(button.Name == "denoiseOffButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.Off;
    }
    else if (button.Name == "denoiseOnButton")
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
    }
    else if (button.Name == "denoiseAutoButton")
    {
        _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 (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Supported)
    {
        // Query support for the VideoTemporalDenoising control Off mode
        _isVideoTemporalDenoisingOffSupported = _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 (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.On))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.On;
            _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
        else if (_mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.SupportedModes.Contains(Windows.Media.Devices.VideoTemporalDenoisingMode.Auto))
        {
            _videoDenoisingEnabledMode = Windows.Media.Devices.VideoTemporalDenoisingMode.Auto;
            _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
        }
    }

}

앱이 프레임 처리를 지원할 때 프레임 처리에서 디노이징되지 않은 원시 프레임을 사용할 수 있도록 디노이징 모드를 지원하면 앱은 디노이징 모드를 Off로 설정합니다.

public void EnableFrameProcessing()
{
    // Toggle Off VideoTemporalDenoising
    if (_isVideoTemporalDenoisingOffSupported)
    {
        _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)
    {
        _mediaCapture.VideoDeviceController.VideoTemporalDenoisingControl.Mode = (Windows.Media.Devices.VideoTemporalDenoisingMode)_videoDenoisingEnabledMode;
    }
}

이미지 처리를 위한 비디오 프레임을 가져오는 방법에 대한 자세한 내용은 MediaFrameReader를 사용하여 미디어 프레임 처리를 참조하세요.