مشخصات پروژه
-
0.0
-
1336
-
0
-
0
پروژه تشخیص لبخند با پایتون (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) دقت بالاتری دارند.