الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

vb.net and emgu Face Detection اكتشاف الوجوه

بدأه حسين احمد طالب في 27 أبريل 2013 · 6 رد · 6,371 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مقدمة
توجد كثير من التقنيات يمكن استخدامها بلغة Vb.net بكل سهولة  لكشف الوجوه Face Detection  منها   تقنية Code التي توفرها شركة Google التي موجودة على الرابط التالي

والثانية تقنية OpenCV's توفرها شركة emgu  التي تعتمد على نظرية Viola-Jones method  في تحديد واستكشاف الوجوه في الصورة  موجودة على الرابط التالي  نقوم بتحميل المكتبة من الموقع

 


post-243277-0-14413500-1367043668_thumb.



Face Detection Example



 كيف تستكشف الوجوه بنظرية Viola-Jones
سيكون شرحنا على طريقة عمل  تقنية OpenCV's  التي توفرها شركة emgu  لأننا سنبرمج باستخدام هذه التقنية.     تقنية OpenCV's تعتمد على نظرية Viola-Jones method في استكشاف الوجوه  .   تم اكتشاف هذا النظرية عام 2001 وهذا النظرية تستكشف  كل الأجزاء objects الموجودة في الصورة  ومنها أجزاء الوجه ونحن نجمع أجزاء الوجه لنكون وجه شخص وتلخص في أربع نقاط :
1.    مستطيل بسيط يسمى Haar features
2.    عمل تكامل الصورة لسرعة اكتشاف الأشكال أو الوجوه
3.    استخدام نظرية AdaBoost machine-learning
4.    عمل تجميع لأجزاء الوجه (انف عيون فم) لتكون صورة باستخدام cascaded classifier

نظرية Viola-Jones method تعتمد على  تحويل Haar wavelets في استكشاف الصور                
Haar wavelets هو موجة واحدة مربعة (جزء واحد عالي وجزء واحد واطئ ). في ثنائية الإبعاد هو موجة مربعة مكونة من أزواج من المستطيلات المتجاورة  كل واحدة  لونين اسود وابيض كما في Figure 1
          



post-243277-0-90726200-1367044584_thumb.

Figure 1

معدل Haar   في كل مستطيل  يحسب بطرح مجموع قيم pixel في مناطق سوداء من مجموع قيم pixel في مناطق بيضاء وتقسيمها على مجموع pixel في المنطقتين إذا كان نتيجة الاختلاف اعلي من a threshold  الذي يحدد خلال  نظرية machine-learning يعتبر هذا الجزء هو جزء من الوجه ويتجه ليبحث عن بقية الأجزاء الخاصة بالوجه ضمن نفس المستطيل بتطبيق Haar   على بقية pixel  شاهد Figure 4. عن طريق استخدام تكامل integrating يعني جمع أجزاء الصغيرة مع بعض في هذه الحالة الأجزاء الصغيرة هي قيم  pixel .قيم integral لكل pixel هي مجموع كل pixel التي تقع فوقه . أي في Figure 2. قيمة pixel في موقع 4 هي مجموع (A+B+C+D) قيمة pixel في موقع3 هي (A+C) قيمة pixel في موقع 2 هي (ِ A+B  )   قيمة pixel في الموقع 1 في (A)
وتلخص العملية في هذه المعادلة

integer operations: (x4, y4) - (x2, y2) - (x3, y3) + (x1, y1).

post-243277-0-57469000-1367044643_thumb.

Figure 2
يبدأ بتحريك المربع البحث (الذي يحتوي في داخله على مستطيلات Haar)  من الجزء الأعلى الأيسر  في الصورة وينفذ مستطيلات Haar على كل Pixel الموجودة في المربع باحثا عن وجه الشخص  وبعدها يتحرك المربع إلى اليمين ويستمر إلى أن يصل إلى نهاية الجزء الأيمن  وبعدها يتحرك  المربع إلى الأسفل ويستمر سطر سطر وبعد أن ينتهي من دورة واحدة على كل الصورة بمربع ذو حجم معين يكبر حجم المربع ويعيد البحث في كل الصورة من جديد ويستمر يكبر المربع وينفذ مستطيلات Haar على كل Pixel الموجودة في المربع  حتى أخر مرة يكون المربع مساوي لحجم الصورة حتى يساعده في اكتشاف جميع الوجوه في الصورة مهما اختلف كبر رأس الشخص

 

 


post-243277-0-81246400-1367043861_thumb.

Figure 4

شرح استخدام مكاتب  emgu  بلغة VB.Net  في اكتشاف الوجوه Face Detection

بالبداية ندخل على الربط التالي  نحمل النسخة التي تلاءم نظامنا حسب نوع نظام التشغيل الخاص بنا


post-243277-0-46705500-1367043969_thumb.


إنا هنا اختارت الإصدار  2.4.0.1717 الخاصة بالمعالج ذو 32 bit لان نظامي هكذا.؟؟وسأشرح على  النسخة 2.4.0.1717 نقوم بتحميل النسخة من الموقع..؟




 

بعد التحميل نقوم بتنصيبها في الحاسوب على المسار الذي نريده؟ هنا نصبناها  على قرص \:F

post-243277-0-57792600-1367044035_thumb.

 


سيكون مسار للمجلد  الخاص بالمكتبة  Emgucv  بالشكل التالي

F:\emgucv-windows-x86 2.4.0.1717\

 

 


أكثر مجلدين سنستخدمهم هما مجلد bin ومجلد opencv



ألان نكون مشروع VB.NET جديد فيه نافذتين كما في الشكل  كل وحدة مصممة وفيها أدوات حسب الشكل؟


post-243277-0-08468500-1367043617_thumb.


يوجد نوعين من الأنظمة  نظام bit=X86 ) 32(  ونظام bit=X64)  64   ( نستطيع معرفة نوع نظامنا بالضغط بزر Mouse الأيمن على My Computer واختيار خصائص  سيعرض لنا نوع نظام التشغيل الخاص بنا؟؟ لتحديد النظام الذي سيعمل عليه البرنامج  نصممه نذهب إلى التبويب التالي

(My Project--Compile-- Advanced Compile Options--Target CPU)  



نضغط على Add reference  ونضيف المكاتب التالية Emgu.CV  , Emgu.Util   او كل مكاتب  Emgucv  
حتى لا نواجه مشكلة الموجودة في مجلد ( F:\emgucv-windows-x86 2.4.0.1717\bin )














نذهب داخل مجلد emgucv-windows-x86 2.4.0.1717
اذا كان نظام تشغيلنا 32 bit   نذهب الى المسار التالي

F:\emgucv-windows-x86 2.4.0.1717\bin\x86

اذا كان نظام تشغيلنا 64 bit    نذهب الى المسار التالي

F:\emgucv-windows-x86 2.4.0.1717\bin\x64

 


وننسخ جميع ملفات DLL التي تبدأ بأسم    opencv أو جميعها حتى لا نواجه مشكلة أما إلى المسار الذي يعمل منه البرنامج أي مجلد bin\Debug آو  إلى المسار C:\Windows\System32

كود البرنامج كامل الذي سيكتب في Form1

 

VB.net Code
Imports Emgu.CV
Imports Emgu.CV.Structure
Imports Emgu.Util
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports System.Drawing
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
OpenFileDialog1.ShowDialog()


'Load the image from file
Dim img As New Image(Of Bgr, Byte)(OpenFileDialog1.FileName)

'Load the object detector
Dim faceDetector As New HaarCascade("F:\emgucv-windows-x86 2.4.0.1717\opencv\data\haarcascades\haarcascade_frontalface_default.xml")

'Convert the image to Grayscale
Dim imgGray As Image(Of Gray, Byte) = img.Convert(Of Gray, Byte)()

For Each face As MCvAvgComp In faceDetector.Detect( _
imgGray, _
1.1, _
10, _
CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, _
New Size(20, 20), _
Size.Empty)
img.Draw(face.rect, New Bgr(Color.White), 1)
Next

Form2.Show()
Form2.PictureBox1.Image = img.Bitmap


End Sub
End Class

 



 

شرح كود اكتشاف الوجود خطوة بخطوة

 

1.    نستدعي المكاتب التالية من مكتبة   Emgu بعد أن نضيفها إلى المشروع عن طريق Add Reference

VB.net Code

 

Imports Emgu.CVImports Emgu.CV.StructureImports Emgu.Util

 

 

وقد نحتاج إلى المكاتب التالية يفضل أضافتها حتى لا نواجه مشاكل في الرسم

VB.net Code

 

Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports System.Drawing

 

 

2.    نقرئ الصورة التي نريد تحديد الوجوه فيها  من المسار المخزنة به ونخزنها داخل متغير img  من نوع صورة؟هنا قرئنا صورة مخزنة داخل  المسار

  C:\test.jpg

VB.net Code

 

Dim img As New Image(Of Bgr, Byte)("C:\test.jpg")

 

 

3.    نقرئ الملف haarcascade_frontalface_default.xml الموجود بالمسار

F:\emgucv-windows-x86 2.4.0.1717\opencv\data\haarcascades

وهذا الملف متخصص في تجميع ملامح الوجه  HaarCascade وتكوين وجه للشخص لتحديده شاهد Figure 3



VB.net Code

 

Dim faceDetector As New HaarCascade("F:\emgucv-windows-x86 2.4.0.1717\opencv\data\haarcascades\haarcascade_frontalface_default.xml")

 

 

4.    نحول الصورة التي قرئناها إلى صورة ابيض واسود Gray لان إجراء البحث Detect الموجود في HaarCascade يأخذ الصورة بصيغة Gray

VB.net Code

 

Dim imgGray As Image(Of Gray, Byte) = img.Convert(Of Gray, Byte)()

 

 

5.    نبحث عن كل وجه ضمن الصورة ونضع مستطيل حول الوجه

VB.net Code

 

For Each face As MCvAvgComp In faceDetector.Detect(imgGray, 1.1, 10, CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, New Size(20, 20),Size.Empty)
img.Draw(face.rect, New Bgr(Color.White), 1)
Next

 

 




يأخذ إجراء Draw ثلاث برامترات

Construct

 

img.Draw(face.rect, New Bgr(Color.White), 1)

 

?    البرامتر الأول الوجه الذي نريد تخطيطه
?    البرامتر  الثاني  لون الخط الذي سنرسم به مستطيل حول الوجه
?    البرامتر الثالث هو سمك الخط أو سمك أطراف المستطيل الذي سيغطي كل وجه

6.    الآن تم تحديد كل الوجوه في الصورة بقي فقط نستعرض الصورة ويفضل استعراضها على نافذة ثانية ندرج فيها أداة Picturebox وتستعرض بالشكل التالي

VB.net Code

 

Form2.Show()Form2.PictureBox1.Image = img.Bitmap

 

 

وإذا أردنا أيضا تحديد عيون الأشخاص في الصور فقط نستدعي الملف haarcascade_eye.xml الخاص بمعالج عيون الأشخاص في الصور الصور الموجود في المسار  التالي

F:\emgucv-windows-x86 2.4.0.1717\opencv\data\haarcascades\

ونضيف هذا الكود


VB.net Code

 

'Load the object detector
Dim faceDetector1 As New HaarCascade("F:\emgucv-windows-x86 2.4.0.1717\opencv\data\haarcascades\haarcascade_eye.xml")

For Each face As MCvAvgComp In faceDetector1.Detect(imgGray, 1.1, 10, CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, New Size(20, 20), Size.Empty)
img.Draw(face.rect, New Bgr(Color.Red), 2)
Next

 

 

 

مدونتي

 

http://hussienahmmed.blogspot.com/

4

------------------

حسين الربيعي

 

مهندس برامجيات من العراق

 

ادرس  في  RIT  في الولايات المتحدة

 

مدونتي

http://hussienahmmed.blogspot.com/

 

قناة اليوتيوب الخاصة بلدورات

https://www.youtube.com/user/alxs1aa

#2

السلام عليكم

هل هذه مكتبة جاهزة بالفيجوال بيسك دوت نت تكون موجودة بعد تنصيبها

اي انني لا احتاج الى برمجة الويفليت مثلا

 

وهل تعمل اذا كان اللغة هي فيجوال بيسك 2008

لانه لغة الفيجوال 2012 لا تعمل على حاسبتي على الرغم من انها تتنصب بنجاح

 

ارجو التواصل ان كان ليدك معلومات

 

تحياتي

#3

المكتبة لا تأتي مع الدوت نيت ..

يجب تحميلها من الروابط التي في المشاركة الأولى ..

 

لغة الفيجوال بيسك 2008 هي نفسها 2012 ..

لكن بـIDE وFrameWork متطور .. ليس إلا ..

أي يمكنك إستعمالها في 2005 و2008 و2010و2012 و2013 ..

إلا إذا كانت هناك بعض الخصائص التي لا تتوفر في الإصدارات السابقة .. (وهذا ما لا أعتقده بالنسبة للمكتبة التي تتكلمين عنها)

 

تحياتي :)

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#4

موضوع   اكثر  من  رائع  جزاك  الله  كل  خير :D

للإطلاع  على جديد  الكتب من تأليفي


 


الطريق لاحتراف تطوير المواقع   ج1 | ج2 | ج3 | ج4


 


                    4Colors | Break Out | Classic Snake | لعبة السودوكو - 2014  |  لعبة  XO                      


 


Help Dodo


 


^_^


 

#5

اخي لدي سؤالان اذا امكن

السؤال الاول: قمت بعمل الخطوات المكتوبة بالمنشور اعلاه وتمت العمليات بنجاح وتم اكتشاف الوجه وبعد اغلاق البرنامج وفتحه مرة اخرى لم يعمل وهر اخطاء عديدة

ابتداءا من جمل imports emgu. cv     لانها لم تعد معروفة لديه وكانني لم اقوم بعمل add referrence     ما هو الحل؟

 

السؤال الثاني: كيف يمكن ان نخزن الصورة التي تحوي فقط على المربع الذي يحوي الوجه فقط بدون اي شيء اخر بالصورة؟

 

شكراااا جزيلا

#6

ارجو المساعدة ضروري اخواني

كيف يمكن ان نخزن او نقطع صورة كل وجه الى صورة منفصلة

رحاءااا ارجو الرد لمن يمتلك اي معلومات

شكرا

#7

لتحديد الوجوه بالصورة و حفظها، استخدم خاصية منطقة الاهتمام ROI او Region of Interest الموجوده بالمتغيير الذي يحتوي على الصورة (في المثال المتغيير هو img.ROI) و ادخل ابعاد المربع الموجوده في المتغير (face.rect) و بعد ذلك احفظها img.save

 

ملاحظة:

انا اعرف ان الموضوع قديم :)

مواضيع مشابهة