다음을 통해 공유


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

이 문서에서는 수동 디바이스 컨트롤을 사용하여 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을 사용하면 앱에서 현재 디바이스에서 임시 디노이징이 지원되는지 여부와 지원되는 디노이징 모드를 확인할 수 있습니다. 사용 가능한 노이즈 제거 모드는 Off, OnAuto입니다. 디바이스는 모든 모드를 지원하지 않을 수 있지만 모든 디바이스는 Auto 또는 OnOff를 지원해야 합니다.

다음 예제에서는 간단한 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;
        }
    }

}

앱에서 프레임 처리를 사용하도록 설정하면 해당 모드가 지원되는 경우 디노이징 모드를 해제 로 설정하므로 프레임 처리에서 비정규화되지 않은 원시 프레임을 사용할 수 있습니다.

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를 사용하여 미디어 프레임 처리를 참조하세요.