다음을 통해 공유


카메라 프레임 분석 효과

이 문서에서는 SceneAnalysisEffectFaceDetectionEffect를 사용하여 미디어 캡처 미리 보기 스트림의 콘텐츠를 분석하는 방법을 설명합니다.

장면 분석 효과

SceneAnalysisEffect는 미디어 캡처 미리 보기 스트림의 비디오 프레임을 분석하고 캡처 결과를 개선하기 위한 처리 옵션을 권장합니다. 현재 이 효과는 HDR(High Dynamic Range) 처리를 사용하여 캡처를 개선할 수 있는지 여부를 감지하는 기능을 지원합니다.

효과에서 HDR 사용을 권장하는 경우 다음과 같은 방법으로 HDR을 사용할 수 있습니다.

장면 분석 네임스페이스

장면 분석을 사용하려면 앱에 기본 미디어 캡처에 필요한 네임스페이스 외에 다음 네임스페이스가 포함되어야 합니다.

using Windows.Media.Core;
using Windows.Media.Devices;

장면 분석 효과를 초기화하고 미리 보기 스트림에 추가합니다.

비디오 효과는 캡처 디바이스가 효과를 초기화하는 데 필요한 설정을 제공하는 효과 정의와 효과를 제어하는 데 사용할 수 있는 효과 인스턴스라는 두 가지 API를 사용하여 구현됩니다. 코드 내의 여러 위치에서 효과 인스턴스에 액세스할 수 있으므로 일반적으로 개체를 저장할 멤버 변수를 선언해야 합니다.

private SceneAnalysisEffect _sceneAnalysisEffect;

앱에서 MediaCapture 개체를 초기화한 후 SceneAnalysisEffectDefinition의 새 인스턴스를 만듭니다.

MediaCapture 개체에서 AddVideoEffectAsync를 호출하고 SceneAnalysisEffectDefinition을 제공하고 MediaStreamType.VideoPreview를 지정하여 캡처 스트림이 아닌 비디오 미리 보기 스트림에 효과를 적용해야 함을 나타내면 캡처 디바이스에 효과를 등록합니다. AddVideoEffectAsync는 추가된 효과의 인스턴스를 반환합니다. 이 메서드는 여러 효과 형식과 함께 사용할 수 있으므로 반환된 인스턴스를 SceneAnalysisEffect 개체로 캐스팅해야 합니다.

장면 분석 결과를 받으려면 SceneAnalyzed 이벤트에 대한 처리기를 등록해야 합니다.

현재 장면 분석 효과에는 높은 동적 범위 분석기만 포함되어 있습니다. 효과의 HighDynamicRangeControl.Enabled를 true로 설정하여 HDR 분석을 사용하도록 설정합니다.

// Create the definition
var definition = new SceneAnalysisEffectDefinition();

// Add the effect to the video record stream
_sceneAnalysisEffect = (SceneAnalysisEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);

// Subscribe to notifications about scene information
_sceneAnalysisEffect.SceneAnalyzed += SceneAnalysisEffect_SceneAnalyzed;

// Enable HDR analysis
_sceneAnalysisEffect.HighDynamicRangeAnalyzer.Enabled = true;

SceneAnalyzed 이벤트 처리기 구현

장면 분석 결과는 SceneAnalyzed 이벤트 처리기에 반환됩니다. 처리기에 전달된 SceneAnalyzedEventArgs 개체에는 HighDynamicRangeOutput 개체가 있는 SceneAnalysisEffectFrame개체가 있습니다. 높은 동적 범위 출력의 Certainty 속성은 0에서 1.0 사이의 값을 제공합니다. 여기서 0은 HDR 처리가 캡처 결과를 개선하는 데 도움이 되지 않음을 나타내고 1.0은 HDR 처리가 도움이 되었음을 나타냅니다. HDR을 사용하려는 임계값 지점을 결정하거나 사용자에게 결과를 표시하고 사용자가 결정하도록 할 수 있습니다.

private void SceneAnalysisEffect_SceneAnalyzed(SceneAnalysisEffect sender, SceneAnalyzedEventArgs args)
{
    double hdrCertainty = args.ResultFrame.HighDynamicRange.Certainty;
    
    // Certainty value is between 0.0 and 1.0
    if(hdrCertainty > MyCertaintyCap)
    {
        ShowMessageToUser("Enabling HDR capture is recommended.");
    }
}

처리기에 전달된 HighDynamicRangeOutput 개체에는 HDR 처리를 위한 가변 사진 시퀀스를 캡처하기 위한 제안된 프레임 컨트롤러가 포함된 FrameControllers 속성도 있습니다. 자세한 내용은 가변 사진 시퀀스를 참조하세요.

장면 분석 효과 정리

앱 캡처가 완료되면 MediaCapture 개체를 삭제하기 전에 효과의 HighDynamicRangeAnalyzer.Enabled 속성을 false로 설정하고 SceneAnalyzed 이벤트 처리기를 등록 취소하여 장면 분석 효과를 사용하지 않도록 설정해야 합니다. MediaCapture.ClearEffectsAsync를 호출하여 효과가 추가된 스트림이므로 비디오 미리 보기 스트림을 지정합니다. 마지막으로 멤버 변수를 null로 설정합니다.

// Disable detection
_sceneAnalysisEffect.HighDynamicRangeAnalyzer.Enabled = false;

_sceneAnalysisEffect.SceneAnalyzed -= SceneAnalysisEffect_SceneAnalyzed;

// Remove the effect from the preview stream
await _mediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);

// Clear the member variable that held the effect instance
_sceneAnalysisEffect = null;

얼굴 감지 효과

FaceDetectionEffect는 미디어 캡처 미리 보기 스트림 내에서 얼굴의 위치를 식별합니다. 이 효과를 사용하면 미리 보기 스트림에서 얼굴이 감지될 때마다 알림을 받을 수 있으며 미리 보기 프레임 내에서 감지된 각 얼굴에 대한 경계 상자를 제공합니다. 지원되는 디바이스에서 얼굴 감지 효과는 장면에서 가장 중요한 얼굴에 대해 향상된 노출과 포커스를 제공합니다.

얼굴 감지 네임스페이스

얼굴 인식 기능을 사용하려면 앱에 기본 미디어 캡처에 필요한 네임스페이스 외에 다음 네임스페이스가 포함되어야 합니다.

using Windows.Media.Core;

얼굴 감지 효과를 초기화하고 미리 보기 스트림에 추가합니다.

비디오 효과는 캡처 디바이스가 효과를 초기화하는 데 필요한 설정을 제공하는 효과 정의와 효과를 제어하는 데 사용할 수 있는 효과 인스턴스라는 두 가지 API를 사용하여 구현됩니다. 코드 내의 여러 위치에서 효과 인스턴스에 액세스할 수 있으므로 일반적으로 개체를 저장할 멤버 변수를 선언해야 합니다.

FaceDetectionEffect _faceDetectionEffect;

앱에서 MediaCapture 개체를 초기화한 후 FaceDetectionEffectDefinition의 새 인스턴스를 만듭니다. 빠른 얼굴 감지 또는 보다 정확한 얼굴 감지의 우선 순위를 지정하도록 DetectionMode 속성을 설정합니다. SynchronousDetectionEnabled를 설정하여 들어오는 프레임이 얼굴 감지가 완료될 때까지 지연되지 않도록 지정합니다. 이로 인해 미리 보기 환경이 고르지 않을 수 있습니다.

MediaCapture 개체에서 AddVideoEffectAsync를 호출하고 FaceDetectionEffectDefinition을 제공하고 MediaStreamType.VideoPreview를 지정하여 캡처 스트림이 아닌 비디오 미리 보기 스트림에 효과를 적용해야 함을 나타내면 캡처 디바이스에 효과를 등록합니다. AddVideoEffectAsync는 추가된 효과의 인스턴스를 반환합니다. 이 메서드는 여러 효과 형식과 함께 사용할 수 있으므로 반환된 인스턴스를 FaceDetectionEffect 개체로 캐스팅해야 합니다.

FaceDetectionEffect.Enabled 속성을 설정하여 효과를 사용하거나 사용하지 않도록 설정합니다. FaceDetectionEffect.DesiredDetectionInterval 속성을 설정하여 효과가 프레임을 분석하는 빈도를 조정합니다. 이 두 가지 속성은 미디어 캡처가 진행되는 동안 조정할 수 있습니다.


// Create the definition, which will contain some initialization settings
var definition = new FaceDetectionEffectDefinition();

// To ensure preview smoothness, do not delay incoming samples
definition.SynchronousDetectionEnabled = false;

// In this scenario, choose detection speed over accuracy
definition.DetectionMode = FaceDetectionMode.HighPerformance;

// Add the effect to the preview stream
_faceDetectionEffect = (FaceDetectionEffect)await _mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);

// Choose the shortest interval between detection events
_faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);

// Start detecting faces
_faceDetectionEffect.Enabled = true;

얼굴이 감지되면 알림 받기

비디오 미리 보기에서 감지된 얼굴 주위에 상자를 그리는 등 얼굴이 감지될 때 일부 작업을 수행하려는 경우 FaceDetected 이벤트에 등록할 수 있습니다.

// Register for face detection events
_faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;

이벤트 처리기에서 FaceDetectedEventArgsFaceDetectionEffectFrame.DetectedFaces 속성에 액세스하여 프레임에서 감지된 모든 얼굴 목록을 가져올 수 있습니다. FaceBox 속성은 미리 보기 스트림 차원을 기준으로 검색된 얼굴을 단위로 포함하는 사각형을 설명하는 BitmapBounds 구조체입니다. 미리 보기 스트림 좌표를 화면 좌표로 변환하는 샘플 코드를 보려면 얼굴 감지 UWP 샘플을 참조하세요.

private void FaceDetectionEffect_FaceDetected(FaceDetectionEffect sender, FaceDetectedEventArgs args)
{
    foreach (Windows.Media.FaceAnalysis.DetectedFace face in args.ResultFrame.DetectedFaces)
    {
        BitmapBounds faceRect = face.FaceBox;

        // Draw a rectangle on the preview stream for each face
    }
}

얼굴 감지 효과 정리

앱 캡처가 완료되면 MediaCapture 개체를 삭제하기 전에 FaceDetectionEffect.Enabled를 사용하여 얼굴 감지 효과를 사용하지 않도록 설정하고 이전에 등록한 경우 FaceDetected 이벤트 처리기의 등록을 취소해야 합니다. MediaCapture.ClearEffectsAsync를 호출하여 효과가 추가된 스트림이므로 비디오 미리 보기 스트림을 지정합니다. 마지막으로 멤버 변수를 null로 설정합니다.

// Disable detection
_faceDetectionEffect.Enabled = false;

// Unregister the event handler
_faceDetectionEffect.FaceDetected -= FaceDetectionEffect_FaceDetected;

// Remove the effect from the preview stream
await _mediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);

// Clear the member variable that held the effect instance
_faceDetectionEffect = null;

감지된 얼굴에 대한 포커스 및 노출 지원 확인

모든 디바이스에 감지된 얼굴에 따라 포커스와 노출을 조정할 수 있는 캡처 디바이스가 있는 것은 아닙니다. 얼굴 감지는 디바이스 리소스를 사용하므로 캡처 기능을 사용할 수 있는 디바이스에서만 얼굴 감지를 사용하도록 설정할 수 있습니다. 얼굴 기반 캡처 최적화를 사용할 수 있는지 확인하려면 초기화된 MediaCapture에 대한 VideoDeviceController를 가져와서 비디오 디바이스 컨트롤러의 RegionsOfInterestControl을 가져옵니다. MaxRegions가 하나 이상의 지역을 지원하는지 확인합니다. 그런 다음 검사 AutoExposureSupported 또는 AutoFocusSupported가 true인지 확인합니다. 이러한 조건이 충족되면 디바이스가 얼굴 감지를 활용하여 캡처 기능을 향상시킬 수 있습니다.

var regionsControl = _mediaCapture.VideoDeviceController.RegionsOfInterestControl;
bool faceDetectionFocusAndExposureSupported =
    regionsControl.MaxRegions > 0 &&
    (regionsControl.AutoExposureSupported || regionsControl.AutoFocusSupported);