Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menunjukkan kepada Anda cara menggunakan Pustaka Visi Komputer Sumber Terbuka (OpenCV), pustaka kode asli yang menyediakan berbagai algoritma pemrosesan gambar, dengan kelas MediaFrameReader yang dapat membaca bingkai media dari beberapa sumber secara bersamaan. Contoh kode dalam artikel ini memandu Anda membuat aplikasi sederhana yang mendapatkan bingkai dari sensor warna, mengaburkan setiap bingkai menggunakan pustaka OpenCV, lalu menampilkan gambar yang diproses dalam kontrol Gambar XAML.
Catatan
OpenCV.Win.Core dan OpenCV.Win.ImgProc tidak diperbarui secara teratur dan tidak lulus pemeriksaan kepatuhan Store, oleh karena itu paket ini hanya ditujukan untuk eksperimen.
Artikel ini dibuat berdasarkan konten dua artikel lainnya:
Proses bingkai media dengan MediaFrameReader - Artikel ini menyediakan informasi terperinci tentang menggunakan MediaFrameReader untuk mendapatkan bingkai dari satu atau beberapa sumber bingkai media dan menjelaskan, secara rinci, sebagian besar kode sampel dalam artikel ini. Secara khusus, Bingkai media proses dengan MediaFrameReader menyediakan daftar kode untuk kelas pembantu, FrameRenderer, yang menangani presentasi bingkai media dalam elemen Gambar XAML. Kode sampel dalam artikel ini juga menggunakan kelas pembantu ini.
Memproses bitmap perangkat lunak dengan OpenCV - Artikel ini memandu Anda membuat komponen Windows Runtime kode asli, OpenCVBridge, yang membantu mengonversi antara objek SoftwareBitmap , yang digunakan oleh MediaFrameReader, dan jenis Mat yang digunakan oleh pustaka OpenCV. Kode sampel dalam artikel ini mengasumsikan Anda telah mengikuti langkah-langkah untuk menambahkan komponen OpenCVBridge ke solusi aplikasi UWP Anda.
Selain artikel ini, untuk melihat dan mengunduh sampel lengkap dari skenario kerja menyeluruh yang dijelaskan dalam artikel ini, lihat Sampel Bingkai Kamera + OpenCV di repositori GitHub Sampel Universal Windows.
Untuk mulai mengembangkan dengan cepat, Anda dapat menyertakan pustaka OpenCV dalam proyek aplikasi UWP dengan menggunakan paket NuGet, tetapi paket ini mungkin tidak melewati proses sertifikasi aplikasi saat Anda mengirimkan aplikasi ke Toko, jadi disarankan agar Anda mengunduh kode sumber pustaka OpenCV dan membangun biner sendiri sebelum mengirimkan aplikasi Anda. Informasi yang berkembang dengan OpenCV dapat ditemukan di https://opencv.org
Menerapkan komponen Windows Runtime asli OpenCVHelper
Ikuti langkah-langkah dalam Memproses bitmap perangkat lunak dengan OpenCV untuk membuat komponen Windows Runtime pembantu OpenCV dan menambahkan referensi ke proyek komponen ke solusi aplikasi UWP Anda.
Menemukan grup sumber bingkai yang tersedia
Pertama, Anda perlu menemukan grup sumber bingkai media tempat bingkai media akan diperoleh. Dapatkan daftar grup sumber yang tersedia di perangkat saat ini dengan memanggil MediaFrameSourceGroup.FindAllAsync. Kemudian pilih grup sumber yang menyediakan jenis sensor yang diperlukan untuk skenario aplikasi Anda. Untuk contoh ini, kita hanya memerlukan grup sumber yang menyediakan bingkai dari kamera RGB.
var frameSourceGroups = await MediaFrameSourceGroup.FindAllAsync();
var selectedGroupObjects = frameSourceGroups.Select(group =>
new
{
sourceGroup = group,
colorSourceInfo = group.SourceInfos.FirstOrDefault((sourceInfo) =>
{
// On Xbox/Kinect, omit the MediaStreamType and EnclosureLocation tests
return sourceInfo.SourceKind == MediaFrameSourceKind.Color;
})
}).Where(t => t.colorSourceInfo != null)
.FirstOrDefault();
MediaFrameSourceGroup selectedGroup = selectedGroupObjects?.sourceGroup;
MediaFrameSourceInfo colorSourceInfo = selectedGroupObjects?.colorSourceInfo;
if (selectedGroup == null)
{
return;
}
Menginisialisasi objek MediaCapture
Selanjutnya, Anda perlu menginisialisasi objek MediaCapture untuk menggunakan grup sumber bingkai yang dipilih di langkah sebelumnya dengan mengatur properti SourceGroup dari MediaCaptureInitializationSettings.
Catatan
Teknik yang digunakan oleh komponen OpenCVHelper, dijelaskan secara rinci dalam Memproses bitmap perangkat lunak dengan OpenCV, mengharuskan data gambar berada di memori CPU, bukan memori GPU. Jadi, Anda harus menentukan MemoryPreference.CPU untuk bidang MemoryPreference dari MediaCaptureInitializationSettings.
Setelah objek MediaCapture diinisialisasi, dapatkan referensi ke sumber bingkai RGB dengan mengakses properti MediaCapture.FrameSources.
mediaCapture = new MediaCapture();
var settings = new MediaCaptureInitializationSettings()
{
SourceGroup = selectedGroup,
SharingMode = MediaCaptureSharingMode.ExclusiveControl,
MemoryPreference = MediaCaptureMemoryPreference.Cpu,
StreamingCaptureMode = StreamingCaptureMode.Video
};
try
{
await mediaCapture.InitializeAsync(settings);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("MediaCapture initialization failed: " + ex.Message);
return;
}
var colorFrameSource = mediaCapture.FrameSources[colorSourceInfo.Id];
Menginisialisasi MediaFrameReader
Selanjutnya, buat MediaFrameReader untuk sumber bingkai RGB yang diambil pada langkah sebelumnya. Untuk mempertahankan kecepatan bingkai yang baik, Anda mungkin ingin memproses bingkai yang memiliki resolusi lebih rendah daripada resolusi sensor. Contoh ini menyediakan argumen BitmapSize opsional ke metode MediaCapture.CreateFrameReaderAsync untuk meminta agar bingkai yang disediakan oleh pembaca bingkai diubah ukurannya menjadi 640 x 480 piksel.
Setelah membuat pembaca bingkai, daftarkan handler untuk peristiwa FrameArrived. Kemudian buat objek SoftwareBitmapSource baru, yang akan digunakan kelas pembantu FrameRenderer untuk menyajikan gambar yang diproses. Kemudian panggil konstruktor untuk FrameRenderer. Inisialisasi instans kelas OpenCVHelper yang ditentukan dalam komponen OpenCVBridge Windows Runtime. Kelas pembantu ini digunakan dalam handler FrameArrived untuk memproses setiap bingkai. Terakhir, mulai pembaca bingkai dengan memanggil StartAsync.
BitmapSize size = new BitmapSize() // Choose a lower resolution to make the image processing more performant
{
Height = 480,
Width = 640
};
mediaFrameReader = await mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Argb32, size);
mediaFrameReader.FrameArrived += ColorFrameReader_FrameArrived_OpenCV;
imageElement.Source = new SoftwareBitmapSource();
_frameRenderer = new FrameRenderer(imageElement);
await mediaFrameReader.StartAsync();
Menangani peristiwa FrameArrived
Peristiwa FrameArrived dinaikkan setiap kali bingkai baru tersedia dari pembaca bingkai. Panggil TryAcquireLatestFrame untuk mendapatkan bingkai, jika ada. Dapatkan SoftwareBitmap dari MediaFrameReference. Perhatikan bahwa kelas CVHelper yang digunakan dalam contoh ini memerlukan gambar untuk menggunakan format piksel BRGA8 dengan alfa yang telah ditentukan sebelumnya. Jika bingkai yang diteruskan ke peristiwa memiliki format yang berbeda, konversi SoftwareBitmap ke format yang benar. Selanjutnya, buat SoftwareBitmap untuk digunakan sebagai target operasi kabur. Properti gambar sumber digunakan sebagai argumen ke konstruktor untuk membuat bitmap dengan format yang cocok. Panggil metode Blur kelas pembantu untuk memproses bingkai. Terakhir, berikan gambar output dari operasi kabur ke PresentSoftwareBitmap, metode kelas pembantu FrameRenderer yang menampilkan gambar dalam kontrol Gambar XAML yang diinisialisasi.
private void ColorFrameReader_FrameArrived_OpenCV(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
var mediaFrameReference = sender.TryAcquireLatestFrame();
if (mediaFrameReference != null)
{
SoftwareBitmap openCVInputBitmap = null;
var inputBitmap = mediaFrameReference.VideoMediaFrame?.SoftwareBitmap;
if (inputBitmap != null)
{
//The XAML Image control can only display images in BRGA8 format with premultiplied or no alpha
if (inputBitmap.BitmapPixelFormat == BitmapPixelFormat.Bgra8
&& inputBitmap.BitmapAlphaMode == BitmapAlphaMode.Premultiplied)
{
openCVInputBitmap = SoftwareBitmap.Copy(inputBitmap);
}
else
{
openCVInputBitmap = SoftwareBitmap.Convert(inputBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
}
SoftwareBitmap openCVOutputBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, openCVInputBitmap.PixelWidth, openCVInputBitmap.PixelHeight, BitmapAlphaMode.Premultiplied);
// operate on the image and render it
openCVHelper.Blur(openCVInputBitmap, openCVOutputBitmap);
_frameRenderer.PresentSoftwareBitmap(openCVOutputBitmap);
}
}
}
Topik terkait
- Kamera
- Pengambilan foto, video, dan audio dasar dengan MediaCapture
- Memproses bingkai media dengan MediaFrameReader
- Memproses bitmap perangkat lunak dengan OpenCV
- Sampel bingkai kamera
- Bingkai Kamera + Sampel OpenCV