Efek untuk menganalisis bingkai kamera

Artikel ini menjelaskan cara menggunakan SceneAnalysisEffect dan FaceDetectionEffect untuk menganalisis konten aliran pratinjau tangkapan media.

Efek analisis adegan

SceneAnalysisEffect menganalisis bingkai video di aliran pratinjau tangkapan media dan merekomendasikan opsi pemrosesan untuk meningkatkan hasil pengambilan. Saat ini, efek mendukung deteksi apakah tangkapan akan ditingkatkan dengan menggunakan pemrosesan Rentang Dinamis Tinggi (HDR).

Jika efek merekomendasikan penggunaan HDR, Anda dapat melakukan ini dengan cara berikut:

Namespace analisis adegan

Untuk menggunakan analisis adegan, aplikasi Anda harus menyertakan namespace berikut selain namespace layanan yang diperlukan untuk pengambilan media dasar.

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

Menginisialisasi efek analisis adegan dan menambahkannya ke aliran pratinjau

Efek video diimplementasikan menggunakan dua API, definisi efek, yang menyediakan pengaturan yang diperlukan perangkat penangkapan untuk menginisialisasi efek, dan instans efek, yang dapat digunakan untuk mengontrol efeknya. Karena Anda mungkin ingin mengakses instans efek dari beberapa tempat dalam kode Anda, Anda biasanya harus mendeklarasikan variabel anggota untuk menahan objek.

private SceneAnalysisEffect _sceneAnalysisEffect;

Di aplikasi Anda, setelah Menginisialisasi objek MediaCapture , buat instans baru SceneAnalysisEffectDefinition.

Daftarkan efek dengan perangkat penangkapan dengan memanggil AddVideoEffectAsync pada objek MediaCapture Anda, menyediakan SceneAnalysisEffectDefinition dan menentukan MediaStreamType.VideoPreview untuk menunjukkan bahwa efek harus diterapkan ke aliran pratinjau video, dibandingkan dengan aliran pengambilan. AddVideoEffectAsync mengembalikan instans efek tambahan. Karena metode ini dapat digunakan dengan beberapa jenis efek, Anda harus mentransmisikan instans yang dikembalikan ke objek SceneAnalysisEffect .

Untuk menerima hasil analisis adegan, Anda harus mendaftarkan handler untuk peristiwa SceneAnalyzed .

Saat ini, efek analisis adegan hanya mencakup penganalisis rentang dinamis tinggi. Aktifkan analisis HDR dengan mengatur HighDynamicRangeControl.Enabled ke true.

// 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;

Menerapkan penanganan aktivitas SceneAnalyzed

Hasil analisis adegan dikembalikan dalam penanganan aktivitas SceneAnalyzed . Objek SceneAnalyzedEventArgs yang diteruskan ke handler memiliki objek SceneAnalysisEffectFrame yang memiliki objek HighDynamicRangeOutput . Properti Kepastian dari output rentang dinamis tinggi memberikan nilai antara 0 dan 1,0 di mana 0 menunjukkan bahwa pemrosesan HDR tidak akan membantu meningkatkan hasil penangkapan dan 1,0 menunjukkan bahwa pemrosesan HDR akan membantu. Anda dapat memutuskan titik ambang di mana Anda ingin menggunakan HDR atau menampilkan hasilnya kepada pengguna dan membiarkan pengguna memutuskan.

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.");
    }
}

Objek HighDynamicRangeOutput yang diteruskan ke handler juga memiliki properti FrameControllers yang berisi pengontrol bingkai yang disarankan untuk menangkap urutan foto variabel untuk pemrosesan HDR. Untuk informasi selengkapnya, lihat Urutan foto variabel.

Membersihkan efek analisis adegan

Setelah aplikasi Anda selesai menangkap, sebelum membuang objek MediaCapture , Anda harus menonaktifkan efek analisis adegan dengan mengatur properti HighDynamicRangeAnalyzer.Enabled efek ke false dan membatalkan pendaftaran penanganan aktivitas SceneAnalyzed Anda. Panggil MediaCapture.ClearEffectsAsync, menentukan aliran pratinjau video karena itu adalah aliran tempat efek ditambahkan. Terakhir, atur variabel anggota Anda ke 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;

Efek deteksi wajah

FaceDetectionEffect mengidentifikasi lokasi wajah dalam aliran pratinjau tangkapan media. Efeknya memungkinkan Anda menerima pemberitahuan setiap kali wajah terdeteksi di aliran pratinjau dan menyediakan kotak pembatas untuk setiap wajah yang terdeteksi dalam bingkai pratinjau. Pada perangkat yang didukung, efek deteksi wajah juga memberikan paparan yang ditingkatkan dan fokus pada wajah yang paling penting di adegan.

Namespace deteksi wajah

Untuk menggunakan deteksi wajah, aplikasi Anda harus menyertakan namespace berikut selain namespace layanan yang diperlukan untuk pengambilan media dasar.

using Windows.Media.Core;

Menginisialisasi efek deteksi wajah dan menambahkannya ke aliran pratinjau

Efek video diimplementasikan menggunakan dua API, definisi efek, yang menyediakan pengaturan yang diperlukan perangkat penangkapan untuk menginisialisasi efek, dan instans efek, yang dapat digunakan untuk mengontrol efeknya. Karena Anda mungkin ingin mengakses instans efek dari beberapa tempat dalam kode Anda, Anda biasanya harus mendeklarasikan variabel anggota untuk menahan objek.

FaceDetectionEffect _faceDetectionEffect;

Di aplikasi Anda, setelah Menginisialisasi objek MediaCapture , buat instans baru FaceDetectionEffectDefinition. Atur properti DetectionMode untuk memprioritaskan deteksi wajah yang lebih cepat atau deteksi wajah yang lebih akurat. Atur SynchronousDetectionEnabled untuk menentukan bahwa bingkai masuk tidak tertunda menunggu deteksi wajah selesai karena ini dapat mengakibatkan pengalaman pratinjau yang berombak.

Daftarkan efek dengan perangkat pengambilan dengan memanggil AddVideoEffectAsync pada objek MediaCapture Anda, menyediakan FaceDetectionEffectDefinition dan menentukan MediaStreamType.VideoPreview untuk menunjukkan bahwa efek harus diterapkan ke aliran pratinjau video, dibandingkan dengan aliran pengambilan. AddVideoEffectAsync mengembalikan instans efek tambahan. Karena metode ini dapat digunakan dengan beberapa jenis efek, Anda harus mentransmisikan instans yang dikembalikan ke objek FaceDetectionEffect .

Aktifkan atau nonaktifkan efek dengan mengatur properti FaceDetectionEffect.Enabled . Sesuaikan seberapa sering efek menganalisis bingkai dengan mengatur properti FaceDetectionEffect.DesiredDetectionInterval . Kedua properti ini dapat disesuaikan saat pengambilan media sedang berlangsung.


// 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;

Menerima pemberitahuan saat wajah terdeteksi

Jika Anda ingin melakukan beberapa tindakan saat wajah terdeteksi, seperti menggambar kotak di sekitar wajah yang terdeteksi dalam pratinjau video, Anda dapat mendaftar untuk peristiwa FaceDetected .

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

Dalam handler untuk peristiwa tersebut, Anda bisa mendapatkan daftar semua wajah yang terdeteksi dalam bingkai dengan mengakses properti FaceDetectionEffectFrame.DetectedFaces dari FaceDetectedEventArgs. Properti FaceBox adalah struktur BitmapBounds yang menjelaskan persegi panjang yang berisi wajah yang terdeteksi dalam unit relatif terhadap dimensi aliran pratinjau. Untuk melihat kode sampel yang mengubah koordinat aliran pratinjau menjadi koordinat layar, lihat sampel UWP deteksi wajah.

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
    }
}

Membersihkan efek deteksi wajah

Setelah aplikasi Anda selesai menangkap, sebelum membuang objek MediaCapture , Anda harus menonaktifkan efek deteksi wajah dengan FaceDetectionEffect.Enabled dan membatalkan pendaftaran penanganan aktivitas FaceDetected Jika Anda sebelumnya mendaftarkan. Panggil MediaCapture.ClearEffectsAsync, menentukan aliran pratinjau video karena itu adalah aliran tempat efek ditambahkan. Terakhir, atur variabel anggota Anda ke 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;

Periksa dukungan fokus dan paparan untuk wajah yang terdeteksi

Tidak semua perangkat memiliki perangkat tangkapan yang dapat menyesuaikan fokus dan paparannya berdasarkan wajah yang terdeteksi. Karena deteksi wajah menggunakan sumber daya perangkat, Anda mungkin hanya ingin mengaktifkan deteksi wajah pada perangkat yang dapat menggunakan fitur untuk meningkatkan pengambilan. Untuk melihat apakah pengoptimalan pengambilan berbasis wajah tersedia, dapatkan VideoDeviceController untuk MediaCapture anda yang diinisialisasi lalu dapatkan RegionsOfInterestControl pengontrol perangkat video. Periksa untuk melihat apakah MaxRegions mendukung setidaknya satu wilayah. Kemudian periksa untuk melihat apakah AutoExposureSupported atau AutoFocusSupported benar. Jika kondisi ini terpenuhi, maka perangkat dapat memanfaatkan deteksi wajah untuk meningkatkan pengambilan.

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