Metode & Algoritma | List Tutorials | Source Code | About | Sitemap
Konsultan Tesis
Bimbingan dan Konsultasi Tesis Informatika bersama team Project Graduate Indonesia. Konsultasi hanya untuk yang sudah me-Like FB kami (Silahkan LIKE tombol ini jika belum).
. Scroll kebawah untuk memasukan kode AntiSpam Protection. Hasil konsultasi akan kami kirimkan ke email Anda.

Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code




.


Metode dan Algoritma | Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code . Anda bisa melakukan konsultasi tentang Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code melalui form di samping kanan !!!

iklan wordpress sekseh skateline


facebook


Webcam dan mikrofon API adalah hal pertama saya bermain dengan Silverlight setelah 4 beta telah dirilis di PDC tahun lalu. Menurut pendapat saya, itu salah satu fitur keren.Anda dapat melakukan banyak aplikasi menyenangkan Silverlight dengan itu juga.


Ketika SLARToolkit dirilis, akhirnya saya punya waktu untuk menerapkan waktu deteksi wajah real time menggunakan Silverlight 4 webcam API.


Artikel ini akan menjelaskan metode pengakuan sederhana wajah yang akan mencari suatu daerah kulit warna tertentu berukuran di snapshot webcam. Teknik ini tidak sesempurna perpustakaan visi komputer profesional seperti OpenCV dan Haar-seperti fitur yang mereka gunakan, tapi berjalan secara real time dan bekerja untuk skenario yang paling webcam.


Demo Aplikasi


Anda perlu webcam dan setidaknya Silverlight 4 runtime diinstal untuk menjalankan sampel. Pada saat ini kandidat rilis tersedia untuk Windows dan Mac . Wilayah wajah harus diterangi dengan baik dan latar belakang harus kontras warna kulit untuk mendapatkan hasil terbaik.


clip image003 c131258f f36f 4ef2 ba9b 4e13d6f215b1


Bagaimana Menggunakan


Anda dapat memulai dan menghentikan webcam dengan clip image005 thumb  Tombol, atau Anda dapat memuat gambar dari disk dengan clip image007 thumb  Tombol. Gunakan ComboBox untuk mengubah modus demo dari “Sorot” untuk “Sorot” hanya menarik elips merah di sekitar wajah yang terdeteksi dan “Gambar” overlay daerah wajah dengan gambar “Image.”. Kepala kera adalah gambar default (Gambar 11), tapi mungkin untuk menerapkan gambar yang berbeda dengan memasukkan URI dalam TextBox. Anda dapat menggunakan Slider kontrol untuk mengubah batas warna kulit dalam ruang warna YCbCr (lihat Langkah 2: Menyaring Warna Kulit). Simpan hasil dari deteksi wajah (termasuk gambar overlay) ke disk dengan clip image009 thumb  Tombol.


Ketika Anda mengklik clip image005 5B1 5D thumb  Tombol untuk pertama kalinya, Anda akan perlu memberikan izin untuk menangkap. Aplikasi ini menggunakan default perangkat Silverlight ambil. Anda dapat menentukan video standar dan perangkat audio dengan Konfigurasi Silverlight.Hanya tekan tombol mouse sebelah kanan atas aplikasi, klik “Silverlight” dalam menu konteks dan pilih “Webcam / Mic” tab untuk mengatur mereka.


Cara Bekerja


Idenya adalah untuk mengambil snapshot dari webcam, filter warna kulit dengan menggunakan ambang batas warna, menerapkan penyaring untuk mengurangi kebisingan, menemukan wajah wilayah-dan kemudian melakukan hal-hal yang menyenangkan dengan informasi ini. Pada bagian berikut saya akan menunjukkan bagaimana melakukan ini dengan menggunakan pendekatan segmentasi warna kulit sederhana. Untuk kejelasan, saya telah mengurangi listing kode untuk hanya apa yang relevan di sini. Kode sumber lengkap tersedia di CodePlex dan berlisensi di bawah Ms-PL.


clip image010 thumb


Gambar 1: enam langkah


Langkah 1: Menangkap Webcam


Silverlight 4 webcam API mudah digunakan. Para kelas CaptureSource menyediakan aliran webcam dan Anda dapat menggunakannya sebagai sumber dari VideoBrush , yang pada gilirannya mengisi persegi panjang untuk menunjukkan feed video dari webcam.Kami akan menggunakan perangkat default video capture, tetapi Anda juga dapat iteratekelas CaptureDeviceConfiguration untuk mendapatkan semua perangkat menangkap pada sistem. Pengguna dapat menentukan standar video dan perangkat audio dengan konfigurasi Silverlight, dia atau dia hanya menekan tombol mouse sebelah kanan atas aplikasi Silverlight, klik “Silverlight” dalam menu konteks dan pilih “Webcam / Mic” tab untuk mengatur mereka.


Inisialisasi dari webcam:


C #


[sourcecode language="csharp"]


/ / Buat capturesource dan menggunakan perangkat default video capture

captureSource = baru CaptureSource ();

captureSource.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice ();

captureSource.CaptureImageCompleted + = new EventHandler (captureSource_CaptureImageCompleted);


/ / Mulai menangkap

jika (captureSource.State = CaptureState.Started!)

{

/ / Buat kuas video dan mengisi persegi panjang WebcamVideo dengan itu

vidBrush var = new VideoBrush ();

vidBrush.Stretch = Stretch.Uniform;

vidBrush.SetSource (captureSource);

WebcamVideo.Fill = vidBrush;


/ / Meminta user untuk izin dan mulai menangkap

if (CaptureDeviceConfiguration.RequestDeviceAccess ())

{

captureSource.Start ();

}

}


[/language]


Sekarang bahwa kita memiliki webcam dan berjalan, kita perlu mengambil snapshot dari aliran video untuk memberi makan deteksi wajah. Anda dapat menggunakan kustomVideoSink pelaksanaan tugas ini, tetapi CaptureSource juga menyediakan built-in metode CaptureImageAsync, yang lebih mudah digunakan. Kinerja yang tidak jauh lebih buruk daripada VideoSink kustom.


<strong>C #</strong>


[sourcecode language="csharp"]


/ / Bagian dari metode RunUpdate dari kelas MainPage

var dispatcherTimer = baru DispatcherTimer ();

dispatcherTimer.Interval = TimeSpan baru (0, 0, 0, 0, 40); / / 25 fps

dispatcherTimer.Tick + = (s, e) =>

{

/ / Proses kamera snapshot jika mulai

if (== captureSource.State CaptureState.Started)

{

/ / CaptureImageAsync kebakaran acara captureSource_CaptureImageCompleted

captureSource.CaptureImageAsync ();

}

};

dispatcherTimer.Start ();


/ / Event handler captureSource_CaptureImageCompleted kelas MainPage

private void captureSource_CaptureImageCompleted (object sender, CaptureImageCompletedEventArgs e)

{

/ / Proses kamera snapshot

Proses (e.Result);

}


[/sourcecode]


Kami menggunakan DispatcherTimer sini untuk memanggil metode CaptureImageAsync.Setiap kali menangkap dilakukan, metode CaptureImageAsync kebakaran acara CaptureImageCompleted, dan EventArgs menyediakan WriteableBitmap yang berisi snapshot selesai. DispatcherTimer ini diinisialisasi untuk melakukan tugas ini menangkap setiap 40 ms.


clip image011 thumb


Gambar 2: Hasil dari langkah pertama adalah aliran webcam


Langkah 2: Menyaring Warna Kulit


Setelah meraih gambar dari webcam, Anda perlu untuk menyaring warna kulit; ini memungkinkan Anda menemukan wajah dalam langkah berikut. Para WriteableBitmap disediakan melalui acara CaptureImageCompleted menggunakan ruang warna RGB untuk mewakili pixel dan sebenarnya hanya integer array yang 32 bit yang menyimpan alpha, merah, hijau dan biru komponen byte (ARGB) untuk semua piksel.


Ruang warna RGB memiliki beberapa kelemahan utama ketika datang untuk menyaring rentang warna tertentu. Sebagai contoh: kami ingin untuk menyaring warna kulit dengan metode yang kuat yang tidak terlalu banyak terpengaruh oleh kecerahan gambar, tetapi melakukan hal ini dalam ruang warna RGB akan berarti volume ruang yang lebih besar sehingga warna Anda tidak dapat menggunakan sederhana nilai thresholding.


Untungnya, ada ruang warna lain yang tersedia yang tidak menderita dari masalah tersebut. Para ruang warna HSV , misalnya, mendefinisikan warna dalam tiga komponen sebagai Hue, Saturation dan Value (Kecerahan), mana warna yang sebenarnya (Hue) direpresentasikan sebagai lingkaran dari 0 ° sampai 360 ° dan kecerahan adalah ketinggian silinder.


Karena warna rentang yang relevan Hue kulit dari 0 ° – 60 ° dan 300 ° – 360 ° (yang melibatkan perhitungan tambahan) dan konversi RGB ke HSV lebih mahal daripada konversi komputasi ruang warna lain, kita menggunakan ruang warna YCbCr untuk kulit warna penyaringan. YCbCr toko kecerahan dalam komponen Y dan kroma (warna) informasi dalam komponen Cb sebagai biru-perbedaan dan dalam komponen Cr merah-perbedaan. Konversi RGB-YCbCr dapat dilakukan dengan penambahan sederhana dan operasi perkalian. Komponen Y berkisar dari 0 ke 1, Cb dan Cr dari -0,5 sampai 0,5.


Saya menguji beberapa foto orang-orang berwarna yang berbeda, dan menemukan bahwa nilai berikut meliputi rentang warna yang paling kulit (kecuali Navis Mars atau Avatar, mungkin).


Y = [0, 1] Cb = [-0,15, 0,05] Cr = [0,05, 0,20]


Aplikasi sampel juga menyediakan Sliders untuk mengubah ambang dinamis.


Gambar 3 mengilustrasikan berbagai warna YCbCr yang digunakan untuk thresholding. Y adalah konstan pada 0,5; batas bawah Cb yang tersisa dan batas atas adalah benar; ambang Cr rendah di bagian atas dan ambang atas adalah di bagian bawah.


clip image013 thumb


Gambar 3: rentang warna YCbCr. Y = 0,5 Cb = [-0,15, 0,05] Cr = [0,05, 0,20]


Kode sumber yang digunakan untuk menghasilkan bitmap ditunjukkan dalam Gambar 3


Kode sumber yang digunakan untuk menghasilkan bitmap ditunjukkan dalam Gambar 3:


C #


[sourcecode language="cpp"]


/ / Visualisasi metode kelas HistogramVisualizer

public void Visualisasikan (WriteableBitmap permukaan)

{

var w = surface.PixelWidth;

var h = surface.PixelHeight;

piksel var = surface.Pixels;

var min = ini Min.;

var max = ini Max.;

int i;

mengapung XF, YF, cb, cr;


/ / Gunakan Y konstan

mengapung v = min.Y + (max.Y – min.Y) * YFactor;


/ / Interpolasi antara min dan max dan mengatur piksel

for (int y = 0; y <h; y + +)

{

for (int x = 0; x <w; x + +)

{

i = y * w + x;

xf = (float) x / w;

YF = (float) y / jam;

cb = min.Cb + (max.Cb – min.Cb) * xf;

cr = min.Cr + (max.Cr – min.Cr) * YF;

. piksel [y * w + x] = new YCbCrColor (v, cb, cr) ToArgbColori ();

}

}

}


[/sourcecode]


Karena snapshot kamera WriteableBitmap menggunakan ruang warna RGB, kita harus mengubah dari RGB ke YCbCr sebelum kita dapat menerapkan batas:


[sourcecode language="cpp"]


/ / FromArgbColori metode kelas YCbCrColor

public static YCbCrColor FromArgbColori (int warna)

{

/ / Ekstrak komponen RGB dari warna int dan mengkonversi ke rentang [0, 1]

const f = 1f mengapung / 255f;

var r = (byte) (warna>> 16) * f;

var g = (byte) (color>> icon cool * f;

var b = (byte) (warna) * f;


/ / Buat warna YCbCr baru dari warna RGB

var y = r + 0.299f * 0.587f * g + 0.114f * b;

var cb =-0.168736f * r +-0.331264f * g + 0.5f * b;

var cr = 0.5f * r +-0.418688f * g +-0.081312f * b;


kembali baru YCbCrColor (y, cb, cr);

}


[/sourcecode]


Selama proses thresholding, setiap pixel dari WriteableBitmap diubah dari RGB ke YCbCr dan diuji terhadap ambang batas atas dan bawah didefinisikan:


C #


[sourcecode language="cpp"]


/ / Proses metode kelas ColorRangeFilter

publik WriteableBitmap Proses (WriteableBitmap snapshot)

{

var p = snapshot.Pixels;

var result = baru WriteableBitmap (snapshot.PixelWidth, snapshot.PixelHeight);

var rp = result.Pixels;


/ / Setiap pixel Ambang

for (int i = 0; i <p.Length; i + +)

{

var YCbCr = YCbCrColor.FromArgbColori (p [i]);

if (ycbcr.Y> = LowerThreshold.Y & & ycbcr.Y <= UpperThreshold.Y

& & Ycbcr.Cb> = LowerThreshold.Cb & & ycbcr.Cb <= UpperThreshold.Cb

& & Ycbcr.Cr> = LowerThreshold.Cr & & ycbcr.Cr <= UpperThreshold.Cr)

{

rp [i] = 0xFFFFFF;

}

}


kembali hasil;

}


[/sourcecode]


Setelah thresholding yang dilakukan dan pixel jatuh dalam kisaran warna kulit, sebuah piksel putih ditulis ke WriteableBitmap dihasilkan. Hal ini menghasilkan gambar hitam & putih biner bahwa masker warna kulit dan kemudian digunakan pada langkah berikutnya.


clip image014 thumb


Gambar 4: Hasil dari langkah kedua adalah warna kulit gambar biner disaring


Langkah 3: Mengurangi Kebisingan dengan Erosi


Kulit warna-disaring gambar berisi area pixel kecil dari latar belakang yang sebagian besar disebabkan oleh noise. Noise dapat mencegah segmentasi yang jelas dalam langkah-langkah selanjutnya, jadi kita harus menghapusnya.


Erosi adalah filter citra umum dapat Anda gunakan untuk tugas ini. Operator morfologi Erosi mengurangi batas-batas daerah berwarna sehingga daerah yang sangat kecil akan dihapus dan hanya lebih besar daerah tetap. Ia bekerja dengan iterasi atas semua piksel dari WriteableBitmap dan pengujian untuk melihat apakah pixel tetangga c piksel saat ini kosong (nol) atau tidak. Jika salah satu tetangga piksel kosong, c piksel saat ini telah menjadi pixel batas dan dengan demikian harus dihapus (diatur ke hitam). Berapa banyak piksel tetangga yang diuji tergantung pada pelaksanaan beton. Ini set koordinat titik uji biasanya disebut kernel dalam pengolahan citra.


Karena langkah sebelumnya menghasilkan gambar hitam & putih, kita dapat menggunakan operator biner Erosi sederhana di sini. Ternyata bahwa 5 x 5 kernel yang optimal untuk kasus ini digunakan. Untuk-loop yang biasanya akan digunakan untuk mengimplementasikan operator Erosi generik membuka gulungan menjadi 5 * 5 = 25 tes piksel tetangga untuk performa yang lebih baik.


[sourcecode language="csharp"]


C #


/ / Proses metode kelas Erode5x5Filter

publik WriteableBitmap Proses (WriteableBitmap masukan)

{

var p = input.Pixels;

var w = input.PixelWidth;

var h = input.PixelHeight;

var result = baru WriteableBitmap (w, h);

var rp = result.Pixels;

var kosong = CompareEmptyColor; / / = 0

int c, cm;

int i = 0;


/ / Setiap pixel Erode

for (int y = 0; y <h; y + +)

{

for (int x = 0; x <w; x + +, i + +)

{

/ / Pixel Tengah

cm = p [y * w + x];

if (== cm kosong) {melanjutkan;}


/ / Row 0

/ / Kiri pixel

jika (x – 2> 0 & & y – 2> 0)

{

c = p [(y - 2) * w + (x - 2)];

if (c == kosong) {melanjutkan;}

}

/ / Pixel Tengah kiri

jika (x – 1> 0 & & y – 2> 0)

{

c = p [(y - 2) * w + (x - 1)];

if (c == kosong) {melanjutkan;}

}

if (y – 2> 0)

{

c = p [(y - 2) * w + x];

if (c == kosong) {melanjutkan;}

}

jika (x + 1 <b & & y – 2> 0)

{

c = p [(y - 2) * w + (x + 1)];

if (c == kosong) {melanjutkan;}

}

jika (x + 2 <w & & y – 2> 0)

{

c = p [(y - 2) * w + (x + 2)];

if (c == kosong) {melanjutkan;}

}


/ / Baris 1

/ / Kiri pixel

jika (x – 2> 0 & & y – 1> 0)

{

c = p [(y - 1) * w + (x - 2)];

if (c == kosong) {melanjutkan;}

}


/ / …

/ / … Proses sisa 24 piksel tetangga

/ / …


/ / Jika semua tetangga piksel diproses

/ / Sudah jelas bahwa saat ini tidak piksel pixel batas.

rp [i] = cm;

}

}


kembali hasil;

}


[/sourcecode]


clip image015 thumb


Gambar 5: Hasil dari langkah ketiga adalah gambar berkurang noise


Langkah 4: Memperluas dengan pelebaran


Selain menghilangkan kebisingan, Erosi menyusut daerah wajah. Sayangnya ini menyebabkan beberapa lubang-terutama di daerah sekitar mata-timbul atau memperbesar, yang dapat menyebabkan segmentasi warna yang salah. Itulah di mana operator morfologi lainnya yang mendasar, pelebaran , datang ke dalam bermain


Pelebaran membesar dan memperluas batas-batas daerah dengan iterasi atas semua pixel dari WriteableBitmap tersebut. Kali ini, meskipun, itu diperiksa jika salah satu piksel tetangga piksel c saat ini tidak kosong (putih). Jika hanya satu dari pixel tetangga tidak kosong, c pixel saat ini akan ditetapkan ke putih.


Hasil terbaik dicapai ketika Pelebaran dengan sebuah kernel 5 5 x diterapkan tiga kali.


C # 


 / / Proses metode kelas Dilate5x5Filter yang diterapkan 3 kali Proses publik WriteableBitmap (WriteableBitmap input) {var p = input.Pixels; var w = input.PixelWidth; var h = input.PixelHeight; hasil var = new WriteableBitmap (w, h); var rp = result.Pixels; var r = ini ResultColor; var kosong = CompareEmptyColor; / / = 0 int c, cm; int i = 0; / / Melebarkan setiap pixel for (int y = 0;. y < h, y + +) {for (int x = 0; x <w; x + +, i + +) {/ / cm pixel Tengah = p [y * w + x];? / / Apakah piksel kosong / / Jika tidak kita mengatur hasil dan lanjutkan dengan piksel berikutnya jika (cm = kosong!) {rp [i] = r; melanjutkan;} / / Row 0 / / Kiri piksel jika (x - 2> 0 & & y - 2> 0) {c = p [(y - 2) * w + (x - 2)];. / / Jika hanya salah satu piksel tetangga tidak kosong, / / kita set hasil dan lanjutkan dengan piksel berikutnya jika (! c = kosong) {rp [i] = r; melanjutkan;}} / / piksel kiri Tengah jika (x - 1> 0 & & y - 2> 0) {c = p [(y - 2) * w + (x - 1)] , jika (c = kosong!) {rp [i] = r; melanjutkan;}} if (y - 2> 0) {c = p [(y - 2) * w + x];! if (c = kosong ) {rp [i] = r; melanjutkan;}} if (x + 1 <b & & y - 2> 0) {c = p [(y - 2) * w + (x + 1)]; if (c = kosong) {rp [i] = r; melanjutkan;}} if (x + 2 <w & & y - 2> 0) {c = p [(y - 2) * w + (x + 2)]; if (c = kosong!) {rp [i] = r; melanjutkan;}} / / Row 1 / pixel / Kiri jika (x - 2> 0 & & y - 1> 0) {c = p [(y - 1 ) * w + (x - 2)];! jika (c = kosong) {rp [i] = r; melanjutkan;}} / / ... / / ... Proses sisa 24 piksel tetangga / / ...}} return result;}

clip image016 thumb


Gambar 6: Hasil dari langkah keempat setelah menerapkan pelebaran tiga kali


Langkah 5: Mencari wajah dengan segmentasi histogram


Kulit warna-disaring gambar, terkikis dan melebar merupakan titik awal yang baik untuksegmentasi citra , proses portioning gambar menjadi beberapa set pixel (segmen).Segmentasi citra biasanya digunakan untuk mencari lokasi benda-benda tertentu.


Ada beberapa teknik yang berbeda yang tersedia, sebuah metode yang cepat dan sederhana adalah histogram segmentasi berbasis. Sebuah histogram gambar adalah representasi statistik dari semua piksel yang ada di gambar. Alat gambar paling mengedit memiliki fungsi histogram warna, yang umumnya diimplementasikan sebagai visualisasi grafik yang jumlah warna tertentu dalam gambar. Gambar 7 menunjukkan histogram warna gambar sampel dimana sumbu x grafik mewakili kecerahan dari setiap komponen warna dari 0 sampai 255, dan sumbu y merupakan jumlah piksel untuk intensitas masing-masing.


clip image001 5B1 5D thumb  clip image017 thumb


Gambar 7: Warna histogram dari gambar sampel


Karena warna kulit penyaringan menghasilkan gambar biner, histogram hanya berisi dua nilai untuk jumlah gambar hitam dan putih dan tidak membantu kita untuk menemukan segmen kulit. Untuk memperbaiki ini, kita membutuhkan lokasi piksel putih maksimum untuk sumbu-y-(baris) dan x-axis (kolom). Menghitung piksel putih secara terpisah untuk baris dan kolom menyelesaikan ini.


Gambar 8 menunjukkan baris dan kolom histogram untuk gambar webcam mana warna biru berarti untuk baris dan hijau untuk distribusi kolom piksel putih. Garis kuning menyorot nilai maksimum untuk masing-masing.


clip image019 thumb


Gambar 8: Row dan histogram kolom dari gambar webcam


[sourcecode language="csharp"]


/ / FromWriteableBitmap metode kelas Histogram

Histogram FromWriteabelBitmap publik statis (WriteableBitmap masukan)

{

var p = input.Pixels;

var w = input.PixelWidth;

var h = input.PixelHeight;

var histX = new int [w];

var histY = new int [h];

var kosong = CompareEmptyColor; / / = 0


/ / Membuat baris dan kolom statistik / histogram

for (int y = 0; y <h; y + +)

{

for (int x = 0; x <w; x + +)

{

if (p [y * w + x] = kosong!)

{

histX [x] + +;

histY [y] + +;

}

}

}


kembali Histogram baru (histX, histY);

}


/ / Konstruktor dari kelas Histogram yang digunakan dalam metode FromWriteableBitmap

Histogram publik (int [] histX, int [] histY)

{

X = histX;

Y = histY;


/ / Cari nilai maksimum dan indeks (koordinat) untuk x

int ix = 0, iy = 0, mx = 0, = saya 01;

for (int i = 0; i <histX.Length; i + +)

{

jika (histX [i]> mx)

{

mx = histX [i];

ix = i;

}

}


/ / Cari nilai maksimum dan indeks (koordinat) untuk y

for (int i = 0; i <histY.Length; i + +)

{

jika (histY [i]> saya)

{

saya = histY [i];

iy = i;

}

}


/ / Simpan hasil dalam variabel anggota

Max = new Vector (mx, saya);

MaxIndex = new Vector (ix, iy);

}


[/sourcecode]


Kode yang menarik baris dan kolom ke histogram gambar Pelebaran ditunjukkan pada Gambar 8 menggunakan WriteableBitmapEx metode DrawLine perpustakaan:


[sourcecode language="csharp"]


/ / Visualisasi metode kelas HistogramVisualizer

public void Visualisasikan (WriteableBitmap permukaan)

{

var w = surface.PixelWidth;

var h = surface.PixelHeight;

var skala = Skala ini.;

var histogram = Histogram ini.;

var histX = histogram.X;

var histY = histogram.Y;


/ X / Histogram

for (int x = 0; x <w; x + +)

{

var hx = histX [x];

jika (hx = 0!)

{

var norma = (int) (((float) hx / histogram.Max.X) * skala);

surface.DrawLine (x, h – 1, x, h – norma, Colors.Green);

}

}

/ / Menggambar max

surface.DrawLine (histogram.MaxIndex.X, h – 1, histogram.MaxIndex.X, 0, Colors.Yellow);


/ Y / Histogram

for (int y = 0; y <h; y + +)

{

var hy = histY [y];

jika (hy = 0!)

{

var norma = (int) (((float) hy / histogram.Max.Y) * skala);

surface.DrawLine (w – 1, y, w – norma, y, Colors.Blue);

}

}

/ / Menggambar max

surface.DrawLine (w – 1, histogram.MaxIndex.Y, 0, histogram.MaxIndex.Y, Colors.Yellow);

}


[/sourcecode]


clip image020 thumb


Gambar 9: Hasil dari baris dan kolom tekad histogram


Sekarang kita tahu x-dan y-koordinat memulai piksel putih ‘/ akhir dan di mana puncak maksimum, kita dapat menggunakan informasi ini untuk melakukan segmentasi berbasis histogram aktual. Pendekatan sederhana, kami akan gunakan di sini menemukan benih awal dimana nilai histogram berada di atas setengah dari maksimum histogram itu. Pada langkah sub berikutnya, algoritma dimulai pada benih ditemukan dan mencoba untuk mendeteksi batas-batas segmen di mana nilai histogram di bawah ambang batas tertentu. Biasanya daerah wajah akan menjadi segmen terbesar dalam daftar hasil, yang mengapa segmen diurutkan berdasarkan ukuran.


Pendekatan ini tidak sempurna, tapi itu cukup cepat untuk real time dan bekerja untuk skenario webcam umum.


C # 



 / / Proses metode Proses <Segment> kelas HistogramMinMaxSegmentator publik IEnumerable (WriteableBitmap input) {var hx = Histogram.X; var hy = Histogram.Y; var histUpperThreshold = Histogram.Max * 0.5f; / / Cari bibit untuk segmentasi : / / Semua indeks x dan y dimana nilai histogram berada di atas / / maksimum setengah dan memiliki min jarak const int step = 10; / / x var ix = GetIndicesAboveThreshold (Histogram.MaxIndex.X, langkah, HX, histUpperThreshold.X); ix.AddRange (GetIndicesAboveThreshold (Histogram.MaxIndex.X + langkah, langkah, HX, histUpperThreshold.X)); / / var y iy = GetIndicesAboveThreshold (Histogram.MaxIndex.Y, langkah, hy, histUpperThreshold. Y); iy.AddRange (GetIndicesAboveThreshold (Histogram.MaxIndex.Y + langkah, langkah, Hy, histUpperThreshold.Y)); / / Tentukan batas-batas untuk segmen yang didefinisikan oleh benih var segmen = <Segment> Daftar baru (); foreach (var y0 dalam iy) {foreach (var x0 dalam ix) {var = new Segmen segmen (0, 0, 0, 0); segment.Min.X = GetIndexBelowThreshold (x0, -1, HX, ThresholdLuminance.X) ; segment.Max.X = GetIndexBelowThreshold (x0, 1, HX, ThresholdLuminance.X); segment.Min.Y = GetIndexBelowThreshold (y0, -1, Hy, ThresholdLuminance.Y); segment.Max.Y = GetIndexBelowThreshold (y0, 1, hy, ThresholdLuminance.Y); segments.Add (segmen);}} / / Orde oleh kembalinya segmen terbesar segments.OrderByDescending (s => s.DiagonalSq);} / / GetIndicesAboveThreshold metode kelas Daftar HistogramMinMaxSegmentator swasta < int> GetIndicesAboveThreshold (int start, step int, int [] versi, int ambang batas) {var result = new List <int> (); int hi; for (int i = mulai; i <hist.Length & & i> 0; i + = langkah) {hi = versi [i]; if (hi> ambang batas) {result.Add (i);}} return result;} metode / / GetIndexBelowThreshold dari kelas int GetIndexBelowThreshold HistogramMinMaxSegmentator swasta (int mulai, int langkah , int [] versi, int ambang batas) {int hasil = mulai, hi; for (int i = mulai; i <hist.Length & & i> 0; i + = langkah) {hi = versi [i]; hasil = i , jika (hi <ambang batas) {break;}} return result;}

Langkah 6: melapisi wajah yang terdeteksi


Setelah kita mendapatkan informasi tentang posisi wajah, kita akhirnya bisa melakukan sesuatu yang berguna dan menyenangkan dengan data ini.


Sorot daerah wajah


Informasi segmen dihitung pada langkah sebelumnya berisi-x / y koordinat pusat segmen dan lebar / tinggi. Sangat mudah untuk menyoroti daerah wajah dengan data ini (Gambar 10): Kami menggunakan gambar kosong yang diletakkan di atas output webcam dan menggambar elips merah ke bitmap gambar itu menggunakan WriteableBitmapExmetode DrawEllipse perpustakaan.


clip image021 thumb


Gambar 10: daerah wajah yang disorot


[sourcecode language="csharp"]


/ / Tampilan metode kelas MainPage

private void Overlay (IEnumerable <Segment> foundSegments, int w, int h)

{

/ / Sorot segmen ditemukan dengan elips merah

var result = baru WriteableBitmap (w, h);

foreach (var s dalam foundSegments)

{

/ / Menggunakan pusat segmen dan lebar setengah, tinggi

var c = s.Center;

result.DrawEllipseCentered (CX, cY, s.Width>> 1, s.Height>> 1, Colors.Red);

}

ImgResult.Source = hasil;

}


[/sourcecode]


Hamparan wilayah wajah


Menyoroti wajah bagus (walaupun menyenangkan tidak banyak), tetapi kita juga dapat menggunakan informasi segmen untuk menempatkan gambar wajah dan bergerak / skala itu ke posisi yang sesuai / ukuran. Dalam versi pertama dari aplikasi saya telah menggunakan sebuah foto dari Chuck Norris, tapi aku berubah (karena masalah hukum).Untungnya saya menemukan sebuah snapshot lucu dari orang utan yang Ethan Heinmengambil dan dirilis di bawah lisensi Creative Commons . Kepala kera adalah overlay gambar default (Gambar 11), tetapi Anda bisa menerapkan gambar yang berbeda dengan memasukkan URI dalam TextBox.


[sourcecode language="csharp"]


/ / TransformOverlaidImage metode kelas MainPage

private void TransformOverlaidImage (IEnumerable <Segment> foundSegments, int w, int h)

{

/ / Set lebar dan tinggi gambar dengan menggunakan informasi segmen pertama

var s = foundSegments.First ();

var iw = s.Width;

var ih = s.Height;

ImgOverlay.Width = iw;

ImgOverlay.Height = ih;


/ / Buat transformasi untuk menjaga ukuran gambar dan posisi sinkron dengan daerah wajah

var mengubah = baru TransformGroup ();


/ / Skala gambar dan memindahkannya ke posisi segmen

transform.Children.Add (baru ScaleTransform {

ScaleX = 1,5,

ScaleY = 1,5,

CenterX = iw>> 1,

CenterY = ih>> 1});

transform.Children.Add (baru TranslateTransform {X = s.Min.X, Y = s.Min.Y + 10});


/ Skala / Calcualte dari Bitmap untuk ukuran sebenarnya dan menciptakan transformasi

var sx = (GrdContent.ActualWidth / w);

var sy = (GrdContent.ActualHeight / h);

transform.Children.Add (baru ScaleTransform {ScaleX = sx, sy ScaleY =});


/ / Terapkan transformasi

ImgOverlay.RenderTransform = transformasi;

}


[/sourcecode]


Voila yang iApe:


clip image022 thumb


Gambar 11: Hasil langkah keenam setelah overlay kepala orangutan


Para Ekstra


Selain algoritma kita bahas di atas, aplikasi ini juga memiliki beberapa fungsi tambahan.Anda tidak perlu ini untuk deteksi sendiri, tetapi mereka layak penjelasan.


Ambil snapshot hasil


Anda dapat mengambil snapshot dari hasil akhir (termasuk overlay) dengan clip image009 5B1 5D thumb  Tombol dan kirimkan ke teman-teman Anda, atau menggunakannya sebagai gambar profil atau untuk paspor berikutnya. Kode balik fungsi ini menggunakan WriteableBitmapExperpustakaan metode WriteTga untuk menyimpan hasilnya ke dalam sebuah file gambar TGA.


C #


 / / BtnSnapshot_Click metode kekosongan kelas MainPage swasta BtnSnapshot_Click (object sender, RoutedEventArgs e) {/ / var Render wb = new WriteableBitmap (GrdContent, null); / / Init SaveFileDialog var saveFileDlg = baru SaveFileDialog {DefaultExt = ". Tga", Filter = "Gambar TGA (* tga) | *. tga",};. / / SaveFileDialog.ShowDialog () hanya dapat dipanggil dari user-dimulai kode / / event handler seperti, jika tidak SecurityException adalah dilemparkan jika (saveFileDlg. ShowDialog () Nilai) {using (var dstStream = saveFileDlg.OpenFile ()) {wb.WriteTga (dstStream);}}.}

Beban deteksi gambar


Jika Anda tidak memiliki webcam atau hanya ingin mencoba foto dengan deteksi warna kulit wajah, Anda dapat menggunakan clip image007 5B1 5D thumb Tombol untuk memuat gambar dari disk. Kode di belakang Button membuka dialog file dan mengisi WriteableBitmap dengan data gambar. Jika lebih besar dari ukuran elemen yang akan menunjukkan hal itu, gambar akan diubah ukurannya dengan WriteableBitmapEx metode Resize perpustakaan.


[sourcecode language="csharp"]


/ / BtnOpenPic_Click metode kelas MainPage

private void BtnOpenPic_Click (object sender, RoutedEventArgs e)

{

/ / OpenFileDialog.ShowDialog () hanya dapat dipanggil dari user-dimulai kode

/ / Event handler seperti, jika tidak SecurityException adalah dilemparkan.

var OpenFileDialog = baru OpenFileDialog ();

if (openFileDialog.ShowDialog (). Nilai)

{

/ / Buka sungai dan memuat gambar

menggunakan (var stream = openFileDialog.File.OpenRead ())

{

/ / Isi WriteableBitmap dari arus

bmpImg var = new BitmapImage ();

bmpImg.SetSource (stream);

loadedPicture = baru WriteableBitmap (bmpImg);


/ / Mengubah ukuran gambar jika terlalu besar

var w = (int) GrdContent.Width;

var h = (int) GrdContent.Height;

if (loadedPicture.PixelWidth> w | | loadedPicture.PixelHeight> h)

{

loadedPicture = loadedPicture.Resize (w, h, WriteableBitmapExtensions.Interpolation.Bilinear);

}

}

}

}


[/sourcecode]


Kesimpulan


Artikel ini menunjukkan bagaimana menerapkan sistem pengenalan wajah dengan fitur sederhana webcam baru Silverlight dan dasar segmentasi berbasis histogram warna kulit.Teknik ini tidak sempurna, tetapi bekerja dalam skenario yang paling webcam dan secara real time. Pasti ada ruang untuk perbaikan dalam metode segmentasi dan dalam kinerja.


Jika Anda suka artikel ini, saya akan menulis bagian kedua yang mencakup pendekatan segmentasi yang lebih baik, optimasi kinerja secara keseluruhan dan demo diperpanjang.


Dan jika Anda ingin mencoba ini dan mempelajari lebih lanjut, link ke aplikasi demo hidup dan kode sumber berada di atas artikel itu!


skateline


CONTOH SOURCE CODE


Kode ini dapat digunakan / ditambahkan dalam aplikasi apapun dengan hanya menambahkan kelas yang ada ke dalam kode sumber Anda. Proses lainnya telah diimplementasikan dalam format yang mudah untuk dimengerti dan tepat sesuai dengan fleksibilitas program yang anda butuhkan.


Download  Contoh Program + Source Code Artikel di Atas


download 128x128


Click here


skateline


Artikel lainnya  :


+ Source Code ASP.NET + Source Code C++ + Source  Code C-Sharp + Source Code Delphi + Source Code Java + Source Code JavaScript +  Source code MATLAB + Source Code Ruby + Source Code VB.6.0 + Source Code VB.Net - Adaptive Resonance Theory (ART) - Algoritma & Pemrograman - Algoritma Backpropagation - Algoritma Blowfish - Algoritma Cipher - Algoritma Clustering Gaussians - Algoritma Eigenface - Algoritma Fuzzy C-Means - Algoritma Genetika - Algoritma Huffman - Algoritma Komputer Quantum - Algoritma LOKI - Algoritma MD5 - Algoritma Persamaan Diophantine - Algoritma Rijndael - Algoritma Semut - Algoritma Tabu Search - Analisis Kriteria Majemuk - Analytical Hierarchy Sistem (AHP) - Ant Colony System - Case Based Reasoning (CBR) - Chaotic Encryption Algorithm - Data Encryption  Standard (DES) - Discrete Wavelet Transform - Elliptic Curve Digital Signature Algorithm (ECDSA) - Haar Wavelet - Hidden Markov Model (HMM) - JST Hopfield - Least Significant Bit (LSB) - Metode Analisis Heuristik - Metode Analisis Regresi - Metode Burrows-Wheeler  Transform - Metode Forward Chaining - Metode Gost - Metode Huffman Statis - Metode Hybrid - Metode Insertion Heuristic - Metode Maksimum Likelihood - Metode Newton- Raphson - Metode Otsu - Metode Penyetaraan Histogram - Optical Character Recognition (OCR) - Propagasi Balik - Self Organizing Map (SOM) - Tabu Search - Teorema Bayes -  Transformasi Wavelet Kontinyu Uncategorized ~ Artificial Intelligence ~ Blind Signature ~ Data Mining ~ Decission Support Sistem ~ Digital Signal Processing (DSP) ~ Digital Signature ~ Enkripsi & Dekripsi ~ Image & Data Prossesing ~ Jaringan MANET ~ Jaringan Neural Quantum ~ Jaringan Syaraf Tiruan ~ Judul Skripsi Tesis Informatika ~ Kecerdasan Buatan ~ Kriptografi ~ Model Pemrograman Linear (MPL) ~ Multiple Trip Vehicle Routing Problem (MTVRP) ~ Neural Network ~ Pengenalan Pola ~ Pengenalan Wajah ~ Pengolahan Citra ~ Penjadwalan ~ Pewarnaan Simpul Graph ~ Recognition ~ Sistem Pakar ~ Steganography ~ Tanda Tangan Digital ~ Traveling Salesman Problem (TSP) ~ Watermarking


skateline iklan red31



Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code


Source Code ActionScript AS3 ASP.NET AJAX C / C++ C# Clipper COBOL ColdFusion DataFlex Delphi Emacs Lisp Fortran FoxPro Java J2ME JavaScript JScript Lingo MATLAB Perl PHP PostScript Python SQL VBScript Visual Basic 6.0 Visual Basic .NET Flash MySQL Oracle Android
Related Post :


Project-G
Judul: Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code
Rating: 100% based on 99998 ratings. 5 user reviews.
Ditulis Oleh hank2

Anda sedang membaca artikel tentang Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code, Semoga artikel tentang Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code ini sangat bermanfaat bagi teman-teman semua, jangan lupa untuk mengunjungi lagi melalui link Deteksi Wajah Real Time dengan Silverlight 4 - Contoh Program + Source Code.


Posted by: Metode Algoritma Updated at: 18.27

{ 0 komentar... Views All / Send Comment! }

Posting Komentar