تشخیص لبخند با OpenCV
در این بخش قصد داریم به کمک OpenCV کد تشخیص لبخند یا Smile Detection بنویسیم. برای این منظور ابتدا Face Detection یا تشخیص چهره بر روی تصویر انجام میدهیم تا چهره مورد نظر به دست بیاید. سپس اگر لبخندی در داخل چهره شناسایی شده، وجود داشته باشد آن را تشخیص داده و دور لبخند یک Bounding Box ایجاد میکنیم.
چگونه شروع کنیم!
برای نوشتن کد تشخیص لبخند ابتدا کتابخانه OpenCV که به عنوان ابزار Computer Vision و Image Processing میباشد، و کتابخانه numpy را وارد میکنیم.
در ادامه دو متغیر face_classifier و smile_classifier ایجاد میکنیم. سپس از کتابخانه OpenCV کلاس CascadeClassifier را فراخوانی کرده و داخل این متغیرها ذخیره میکنیم. برای آشنایی و کار با CascadeClassifierها میتوانید به پستهای ماشینیابی، تشخیص چشم، تشخیص عابر و تشخیص چهره رجوع کنید. حال برای هرکدام از این کلاسها فایل classifier خودشان را دانلود میکنیم و در داخل کلاس مخصوص خودشان قرار میدهیم. مثلا برای face فایل classifier مخصوص face را دانلود میکنیم. در مورد smile نیز به همین ترتیب عمل میکنیم. این فایلهای classifier، یک سری مدلهای از پیش آموزش دیده شده هستند که توسط OpenCV ساخته و در قالب فایلهای xml ذخیره میشود. که ما میتوانیم آنها را دانلود کنیم.
نحوه ایجاد Bounding Box
در ادامه کد تشخیص لبخند، یک تابع به نام face_detector ایجاد میکنیم که تصویر مورد نظر و سایزی که قصد داریم تصویر کوچک شود را به عنوان آرگومان میگیرد. در اینجا برای size مقدار پیشفرض 0.5 در نظر گرفتهایم. ابتدا در این تابع با استفاده از متد cvtColor تصویر را gray میکنیم. سپس از classifier چهره متد detectMultiScale را فراخوانی میکنیم و تصویر gray را به این متد میدهیم. و آن را در داخل متغیر face ذخیره میکنیم.
در ادامه بررسی میکنیم که اگر متغیر face وجود نداشت خود تصویر return شود و اگر وجود داشت یک x و y به ما میدهد که نقطه بالا سمت چپ Bounding Rect هست که چهره داخل آن قرار میگیرد. همچنین w و h یعنی پهنا و ارتفاع Bounding Rect را نیز به ما میدهد. سپس یک مستطیل آبی با ضحامت 4 پیکسل را دورچهره ایجاد میکنیم. همچنین roi_gray و roi_color را با اسلایس زدن تصویر خاکستری و تصویر رنگی جهت دریافت قسمت چهره، به دست میآوریم.
از classifier لبخند متد detectMultiScale را فراخوانی میکنیم و تصویر roi_gray را به این متد میدهیم. و آن را در داخل متغیر smiles ذخیره میکنیم. در ادامه به ازای sx, sy, sw و sh موجود در متغیر smile یک مستطیل قرمز با ضخامت 4 پیکسل بر روی تصویر بریده شده رنگی ایجاد میکنیم. و در نهایت frame موردنظر را return میکنیم.
تشخیص لبخند و نمایش آن
ابتدا تصویر بدون Bounding Box را با تابع imread خوانده و در متغیر frame ذخیره میکنیم. سپس frame را با تابع imshow نمایش میدهیم. همچنین با فراخوانی تابع face_detector تصویر با Bounding_Box را نیز نمایش میدهیم.