אתה יכול להשתמש בטשטוש פנים כדי להסתיר את פניו של אדם, בסרטון או בתמונה, מכמה סיבות. נושאי הפרטיות והאבטחה הם הדומיננטיים ביותר. לרוב פלטפורמות שיתוף הווידאו ותוכנות עריכת הווידאו יש פונקציונליות מובנית של טשטוש פנים.
אתה יכול ליצור תוכנית משלך לטשטוש פנים מאפס באמצעות Python וספריות OpenCV ו-NumPy.
הגדרת הסביבה שלך
כדי להמשיך במאמר זה, עליך להכיר את יסודות פייתון ויש להם הבנה בסיסית של באמצעות ספריית NumPy.
פתח כל Python IDE שאתה מרגיש בנוח איתו. צור סביבה וירטואלית בה תתקין את הספריות הנדרשות. צור קובץ Python חדש. נווט אל הטרמינל והפעל את הפקודה הבאה כדי להתקין את הספריות הנדרשות. העבר את הספריות כרשימה מופרדת ברווחים.
pip להתקין את OpenCV-python NumPy
אתה תשתמש ב-OpenCV כדי לקחת ולעבד מראש את קלט הווידאו וב-NumPy לעבודה עם מערכים.
לאחר שהתקנת את הספריות, המתן עד שה-IDE יעדכן את שלדי הפרויקט. כשהעדכון יסתיים והסביבה מוכנה, אתה חופשי להתחיל בקידוד.
קוד המקור המלא זמין ב-a מאגר GitHub.
ייבוא הספריות הנדרשות
התחל בייבוא ספריות OpenCV ו-NumPy. זה יאפשר לך להתקשר ולהשתמש בכל הפונקציות שהם תומכים בהם. יבא את OpenCV-python כ-cv2.
יְבוּא cv2
יְבוּא רדום כפי ש np
המודולים של OpenCV-python משתמשים בשם cv2 כמוסכמה שקהילת OpenCV הקימה. OpenCV-python הוא מעטפת Python של ספריית OpenCV אשר כתובה ב-C++.
לוקח את הקלט שלך
צור משתנה ואתחל את ה צילום וידאו לְהִתְנַגֵד. העבר אפס כארגומנט אם ברצונך להשתמש במצלמה הראשית של המחשב שלך כמקור הקלט. כדי להשתמש במצלמה חיצונית המחוברת למחשב עברו אחת. כדי לבצע טשטוש פנים בסרטון שהוקלט מראש, עברו את נתיב הסרטון במקום זאת. ל להשתמש במצלמה מרוחקת, העבר את כתובת האתר של המצלמה המכילה את כתובת ה-IP ומספר היציאה שלה.
cap = cv2.VideoCapture(0)
כדי לבצע טשטוש פנים בקלט, תזדקק לשלוש פונקציות:
- פונקציה שתעבד מראש את הקלט.
- פונקציה שתטשטש את הפנים בקלט.
- פונקציה ראשית שתשלוט בזרימת התוכנית ותציג את הפלט.
עיבוד מוקדם של קלט הווידאו
צור פונקציית עיבוד מקדים של קלט שתיקח כל פריים של סרטון הקלט כקלט שלו. אתחל את המחלקה CascadeClassifier שבה תשתמש לזיהוי פנים. שנה את גודל המסגרת ל-640 על 640 פיקסלים. המר את המסגרת ששונתה לגווני אפור לעיבוד קל יותר, ולבסוף זהה את הפרצופים בקלט ואגד אותם עם מלבנים.
defimage_preprocess(מִסגֶרֶת):
face_detector = cv2.CascadeClassifier (cv2.data.haarcascades
+ 'haarcascade_frontalface_default.xml')resized_image = cv2.resize (מסגרת, (640, 640))
grey_image = cv2.cvtColor (תמונה משתנה,
cv2.COLOR_BGR2GRAY)face_rects = face_detector.detectMultiScale(
תמונה_אפורה, 1.04, 5, minSize=(20, 20))
לַחֲזוֹר resized_image, face_rects
פונקציה זו מחזירה טופלה המכילה את התמונה שגודלה שונה ורשימת מלבנים המייצגת את הפרצופים שזוהו.
טשטוש הפנים
צור פונקציית טשטוש שתטשטש את הפנים בקלט שלך. הפונקציה לוקחת את המסגרת ששונה את הגודל ואת רשימת המלבנים התוחמים את הפרצופים שהוחזרו על ידי פונקציית העיבוד המקדים כקלט. לולאות מעל כל מלבן פנים. מחשב את מרכז כל מלבן ואת רדיוס העיגול המטשטש. יוצר תמונה שחורה בעלת אותם מידות כמו המסגרת ששונתה על ידי אתחול כל הפיקסלים לאפס. מצייר עיגול לבן על התמונה השחורה שמרכזו נמצא במלבן הפנים באמצעות הרדיוס המחושב. לבסוף, הוא מטשטש את התמונה על העיגול הלבן.
defטשטוש_פנים(מסגרת_שינוי גודל, תיקוני_פנים):
ל (x, y, w, h) ב face_rects:
# ציון המרכז והרדיוס
# של עיגול הטשטוש
center_x = x + w // 3
center_y = y + h // 3
רדיוס = h // 1# יצירת תמונה שחורה בעלת דומה
# מידות כמסגרת
mask = np.zeros((resized_frame.shape[:3]), np.uint8)# צייר עיגול לבן באזור הפנים של המסגרת
cv2.circle (מסכה, (center_x, center_y), רדיוס,
(255, 255, 255), -1)# טשטוש כל המסגרת
blurred_image = cv2.medianBlur (resized_frame, 99)# משחזר את המסגרת:
# - הפיקסלים מהמסגרת המטושטשת אם מסיכה > 0
# - אחרת, קח את הפיקסלים מהמסגרת המקורית
resized_frame = np.where (מסכה > 0, תמונה מטושטשת,
resized_frame)
לַחֲזוֹר resized_frame
הפונקציה משתמשת ב-NumPy איפה() פונקציה לשחזר את המסגרת במהלך טשטוש.
שליטה בזרימת התוכנית שלך
צור פונקציה ראשית שתשמש כנקודת הכניסה לתוכנית שלך. לאחר מכן הוא ישלוט בזרימת התוכנית. הפונקציה תתחיל לולאה אינסופית כדי ללכוד ברציפות את הפריימים של כניסת הווידאו. קרא לשיטת הקריאה של אובייקט הכובע כדי לקרוא מסגרת מהמצלמה.
לאחר מכן הפונקציה תעביר את המסגרת לפונקציית ה-preprocessing ותעביר את ערכי ההחזרה לפונקציה אחרת, face_blur, כדי לקבל תמונה מטושטשת. לאחר מכן הוא משנה את גודל המסגרת המוחזרת על ידי פונקציית הטשטוש ומציג את הפלט.
defרָאשִׁי():
בזמןנָכוֹן:
success, frame = cap.read()
resized_input, face_rects = image_preprocess (מסגרת)
blurred_image = face_blur (שינוי גודל_קלט, face_rects)# הצגת התמונה המטושטשת
cv2.imshow("תמונה מטושטשת", cv2.resize (תמונה מטושטשת, (500, 500)))
אם cv2.waitKey(1) == ord("ש"):
לשבור
הפונקציה גם מסיימת את תצוגת הפלט כאשר המשתמש לוחץ על מקש q.
הפעלת התוכנית
ודא שהפונקציה הראשית פועלת תחילה בעת הפעלת הסקריפט. תנאי זה יהיה שקרי אם אתה מייבא את הסקריפט כמודול בתוכנית אחרת.
אם __שם__ == "__רָאשִׁי__":
רָאשִׁי()
זה מאפשר לך להשתמש בסקריפט כמודול או להפעיל אותו כתוכנית עצמאית. כאשר התוכנית פועלת, אתה אמור לראות פלט דומה לזה:
הפנים מטושטשות ואינן ניתנות לזיהוי.
יישומים בעולם האמיתי של טשטוש פנים
אתה יכול להחיל טשטוש פנים בסוגים רבים של יישומים כדי להגן על הפרטיות של אנשים. שירותי תצוגת רחוב ומיפוי משתמשים בטשטוש כדי לטשטש את פניהם של אנשים בתמונות שהם מצלמים. רשויות אכיפת החוק משתמשות בטשטוש פנים כדי להגן על זהות העדים.
פלטפורמות רבות לשיתוף וידאו שילבו גם תכונה של טשטוש פנים עבור המשתמשים שלהן. השוואת השימוש בטשטוש פנים באזורים אלו תעזור לכם לראות כיצד פלטפורמות אחרות משלבות את הטכנולוגיה.