שלום אורח התחבר

זיהוי פנים ב Python עם OpenCV

נושאים:יומי

זיהוי פנים בתמונה זו בעיה פתורה ומה שכיף בבעיות פתורות זה שאנחנו יכולים ממש בקלות לשלב את הפיתרון גם ביישומים גדולים יותר שלנו. אם אתם רוצים לדעת לעומק איך עושים את זה תצטרכו לקרוא על אלגוריתמים ותמונות והמון דברים שאני לא מספיק מבין בהם, אבל אם אתם פשוט צריכים למצוא פרצוף בתמונה מספיק להשתמש במנגנון הקיים של OpenCV. הנה הקוד שעושה את זה.

תוכן עניינים

  1. התקנת OpenCV
  2. הסקריפט

1התקנת OpenCV

התקנת ספריית OpenCV ב Python היא די פשוטה ובסך הכל דורשת הרצת שתי פקודות pip:

python -m pip install numpy opencv-python

בשביל לבדוק שההתקנה עברה חלק אפשר להפעיל את הסקריפט הבא:

import cv2
print(cv2.__version__)

אני קיבלתי את 4.2.0 אבל אני חושב שכל גירסא מעל 4 תספיק.

הדבר השני שנצטרך הוא קובץ המידע עבור ה Classifier. זה בעצם הקובץ שמספר ל OpenCV מה זה פרצוף. הוא הוכן בתהליך של סריקת המון תמונות וסימון ידני של מאפיינים בתוכן. הקובץ מגיע בפורמט xml ואפשר למצוא מספר אפשרויות לקבצי מידע כאלה במאגר של OpenCV עצמו בגיטהאב.

בפוסט זה אשתמש בקובץ haarcascade_frontalface_default.xml שכולל מידע על פנים של אנשים. אפשר להוריד את הקובץ מהקישור הזה.

2הסקריפט

קובץ ה Python שמזהה פרצופים כולל בסך הכל פחות מ-30 שורות כי את כל העבודה כבר עשו בשבילי ב OpenCV. בגדול אנחנו:

  1. הופכים את התמונה לשחור-לבן כדי שיהיה ל OpenCV יותר קל לעבוד איתה.

  2. מבקשים מ OpenCV למצוא פרצופים בתמונה באמצעות ה Cascader שלנו (זה המידע מקובץ ה xml שלקחנו מהמאגר של OpenCV).

  3. מציירים על התמונה המקורית ריבוע מסביב לכל פרצוף ש OpenCV מצא

  4. מציגים את התמונה עם הריבועים מסביב לפרצופים.

קוד? ברור:

import sys, pathlib
import cv2

imagePath = sys.argv[1]
cascader_file = str(pathlib.Path(__file__).parent / "haarcascade_frontalface_default.xml")
faceCascade = cv2.CascadeClassifier(cascader_file)

image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Detect faces in the image
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags = cv2.CASCADE_SCALE_IMAGE
)

print("Found {0} faces!".format(len(faces)))

# Draw a rectangle around the faces
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow("Faces found", image)
cv2.waitKey(0)

הקוד מבוסס על פוסט באותו נושא מ Real Python וכולל כמה תיקונים שלי כדי שיעבוד עם גירסא חדשה של פייתון ו OpenCV.

בשביל להפעיל אותו אתם מעבירים בשורת הפקודה שם של קובץ תמונה בתור פרמטר ראשון ונותנים לפייתון לעשות את כל השאר.

מעדיפים לקרוא מהטלגרם? בקרו אותנו ב:@tocodeil

או הזינו את כתובת המייל וקבלו את הפוסט היומי בכל בוקר אליכם לתיבה:


נהניתם מהפוסט? מוזמנים לשתף ולהגיב