کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

پروژه تشخیص لبخند با پایتون (OpenCV + Haar)

پروژه تشخیص لبخند با پایتون (OpenCV + Haar)
شرح مختصر پروژه

این پروژه یه برنامه خیلی ساده‌ست با پایتون و OpenCV که با مدل‌های آماده‌ی Haar Cascade اول صورت رو پیدا می‌کنه، بعد اگه لبخند بزنی تشخیص می‌ده و روی تصویر پیام SMILE :) نشون می‌ده. فقط OpenCV رو نصب کن، کد رو اجرا کن و جلوی وب‌کم قرار بگیر—برای خروج هم کلید q رو بزن.

توضیحات پروژه

توی این پروژه یک برنامه خیلی ساده می‌سازیم که با وب‌کم (و یا با دریافت عکس)، صورت را تشخیص می‌ده و بعد لبخند را روی صورت شناسایی می‌کنه.
روش ما «کلاسیک» بوده و با Haar Cascade کار می‌کنه (سریع و سبک، مناسب پروژه‌های آموزشی).

پیش‌نیازها

  • Python 3.9+
  • نصب کتابخانه OpenCV

نصب OpenCV 

توی CMD / Terminal این دستور رو بزنید:

pip install opencv-python

فایل‌های لازم 

OpenCV خودش فایل‌های آماده Haar رو داره. ما از این‌ها استفاده می‌کنیم:

  • haarcascade_frontalface_default.xml (تشخیص صورت)

  • haarcascade_smile.xml (تشخیص لبخند)

✅ راحت‌ترین راه: این فایل‌ها معمولاً داخل مسیر نصب OpenCV روی سیستم شما وجود دارن و ما توی کد، مسیرشون رو به صورت خودکار از cv2.data.haarcascades می‌گیریم. پس لازم نیست دستی دانلود کنید.

 

کد پروژه (وب‌کم)

یک فایل بسازید به اسم smile_detector.py و کد زیر را داخلش قرار دهید:

import cv2

def main():
    # بارگذاری مدل‌های Haar از مسیر داخلی OpenCV
    face_cascade = cv2.CascadeClassifier(
        cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
    )
    smile_cascade = cv2.CascadeClassifier(
        cv2.data.haarcascades + "haarcascade_smile.xml"
    )

    # وبکم
    cap = cv2.VideoCapture(0)

    if not cap.isOpened():
        print("❌ وب‌کم باز نشد. شماره وبکم را تغییر دهید (0/1) یا دسترسی را بررسی کنید.")
        return

    print("✅ برای خروج، کلید q را بزنید.")

    while True:
        ret, frame = cap.read()
        if not ret:
            print("❌ فریم دریافت نشد.")
            break

        # برای سرعت و دقت Haar بهتر است خاکستری کنیم
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # تشخیص صورت‌ها
        faces = face_cascade.detectMultiScale(
            gray,
            scaleFactor=1.2,
            minNeighbors=5,
            minSize=(80, 80)
        )

        for (x, y, w, h) in faces:
            # کادر صورت
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

            # ناحیه صورت برای تشخیص لبخند
            roi_gray = gray[y:y + h, x:x + w]
            roi_color = frame[y:y + h, x:x + w]

            # تشخیص لبخند (در ناحیه صورت)
            smiles = smile_cascade.detectMultiScale(
                roi_gray,
                scaleFactor=1.7,
                minNeighbors=20,
                minSize=(25, 25)
            )

            if len(smiles) > 0:
                cv2.putText(frame, "SMILE :)", (x, y - 10),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2)

                # (اختیاری) نمایش کادر لبخندها
                for (sx, sy, sw, sh) in smiles:
                    cv2.rectangle(roi_color, (sx, sy), (sx + sw, sy + sh), (255, 0, 0), 2)

        cv2.imshow("Smile Detector - Press q to quit", frame)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

 

اجرای پروژه

در همان پوشه‌ای که فایل را ساختید اجرا کنید:


 

python smile_detector.py

  • اگر صورت شما تشخیص داده شود، دور صورت کادر سبز می‌کشد.

  • اگر لبخند تشخیص داده شود، متن SMILE :) نمایش داده می‌شود.

 

نکات مهم برای بهتر کار کردن

  • روبه‌روی دوربین و در نور مناسب باشید.

  • اگر زیاد خطا می‌دهد:

    • مقدار minNeighbors در لبخند را کمی کم کنید (مثلاً 15)

    • یا scaleFactor لبخند را کمی کمتر کنید (مثلاً 1.5)

تنظیمات پیشنهادی سریع

  • حساس‌تر (لبخند بیشتری تشخیص می‌دهد، ولی خطا هم بیشتر):

    • minNeighbors=12 تا 15

  • دقیق‌تر (خطا کمتر، ولی سخت‌گیرتر):

    • minNeighbors=20 تا 30

نسخه ساده برای عکس (اختیاری)

اگر خواستید روی یک تصویر اجرا کنید، این کد را جدا بسازید: smile_on_image.py

import cv2

img_path = "test.jpg"  # عکس را کنار فایل بگذارید

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_smile.xml")

img = cv2.imread(img_path)
if img is None:
    print("❌ عکس پیدا نشد. نام فایل را درست کنید.")
    exit()

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.2, 5)

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]

    smiles = smile_cascade.detectMultiScale(roi_gray, 1.7, 20)

    if len(smiles) > 0:
        cv2.putText(img, "SMILE :)", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2)

    for (sx, sy, sw, sh) in smiles:
        cv2.rectangle(roi_color, (sx, sy), (sx+sw, sy+sh), (255, 0, 0), 2)

cv2.imshow("Smile on Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

سوالات پرتکرار (FAQ)

1) چرا لبخند تشخیص نمی‌دهد؟
نور کم است یا زاویه صورت مناسب نیست. همچنین minNeighbors زیاد سخت‌گیر است.

2) چرا اشتباه لبخند تشخیص می‌دهد؟
Haar روش کلاسیک است و روی برخی چهره‌ها/نورها خطا دارد. minNeighbors را بالا ببرید.

3) آیا می‌شود دقیق‌ترش کرد؟
بله. روش‌های جدیدتر مثل MediaPipe یا مدل‌های یادگیری عمیق (CNN) دقت بالاتری دارند.

1404/11/27 1336 0
رمز عبور : tahlildadeh.com یا www.tahlildade.com
نظرات شما

نظرات خود را ثبت کنید...