מבוא ל- OpenCV עם Java

1. הקדמה

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

2. התקנה

כדי להשתמש בספריית OpenCV בפרויקט שלנו, עלינו להוסיף את ה- opencv תלות Maven שלנו pom.xml:

 org.openpnp opencv 3.4.2-0 

עבור משתמשי Gradle, נצטרך להוסיף את התלות שלנו build.gradle קוֹבֶץ:

קבוצת הידור: 'org.openpnp', שם: 'opencv', גרסה: '3.4.2-0'

לאחר הוספת הספרייה לתלות שלנו, נוכל להשתמש בתכונות המסופקות על ידי OpenCV.

3. שימוש בספרייה

כדי להתחיל להשתמש ב- OpenCV, עלינו לאתחל את הספרייה, מה שאנחנו יכולים לעשות ב רָאשִׁי שיטה:

OpenCV.loadShared ();

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

ראוי לציין שהתיעוד עושה דברים מעט אחרת:

System.loadLibrary (Core.NATIVE_LIBRARY_NAME)

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

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

כעת לאחר שאותחלנו את הספרייה, בואו נראה מה אנחנו יכולים לעשות איתה.

4. טוען תמונות

להתחיל, בואו נטען את תמונת הדוגמה מהדיסק באמצעות OpenCV:

load static public matImage (String imagePath) {Imgcodecs imageCodecs = Imgcodecs חדשים (); להחזיר imageCodecs.imread (imagePath); }

שיטה זו תהיה טען את התמונה הנתונה כ- מַחצֶלֶת אובייקט, שהוא ייצוג מטריצי.

כדי לשמור את התמונה שנטענה בעבר, נוכל להשתמש ב- לחתום () שיטת ה- Imgcodecs מעמד:

בטל סטטי פומבי saveImage (Mat imageMatrix, String targetPath) {Imgcodecs imgcodecs = Imgcodecs חדשים (); imgcodecs.imwrite (targetPath, imageMatrix); }

5. מסווג מפל האר

לפני שנצלול לזיהוי פנים, בואו נבין את מושגי הליבה שמאפשרים זאת.

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

5.1. מאפייני האר

איתור פנים ב- OpenCV נעשה על ידי מסווגי מפל מבוססי Haar.

מאפייני Haar הם פילטרים המשמשים לזיהוי קצוות וקווים בתמונה. המסננים נתפסים כריבועים עם צבעים שחורים ולבנים:

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

6. זיהוי פנים

בדרך כלל, מסווג המפל צריך להיות מאומן מראש כדי להיות מסוגל לזהות משהו בכלל.

מכיוון שתהליך ההדרכה יכול להיות ארוך ודורש מערך נתונים גדול, אנו נשתמש באחד מהמודלים שהוכשרו מראש שמציעה OpenCV. אנו מציבים את קובץ ה- XML ​​הזה ב- אֶמְצָעִי תיקייה לגישה נוחה.

בואו נעבור את תהליך איתור הפנים:

ננסה לזהות את הפנים על ידי מתווה מלבן אדום.

כדי להתחיל, עלינו לטעון את התמונה פנימה מַחצֶלֶת פורמט מנתיב המקור שלנו:

מחצלת loadedImage = loadImage (sourceImagePath);

ואז נכריז על א MatOfRect מתנגד לאחסן את הפרצופים שאנחנו מוצאים:

MatOfRect facesDetected = MatOfRect חדש ();

לאחר מכן עלינו לאתחל את CascadeClassifier לעשות את ההכרה:

CascadeClassifier cascadeClassifier = חדש CascadeClassifier (); int minFaceSize = Math.round (loadedImage.rows () * 0.1f); cascadeClassifier.load ("./ src / main / resources / haarcascades / haarcascade_frontalface_alt.xml"); cascadeClassifier.detectMultiScale (loadedImage, facesDetected, 1.1, 3, Objdetect.CASCADE_SCALE_IMAGE, גודל חדש (minFaceSize, minFaceSize), גודל חדש ());

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

לבסוף נעבור בין הפנים ונשמור את התוצאה:

Rect [] facesArray = facesDetected.toArray (); עבור (Rect face: facesArray) {Imgproc.rectangle (loadedImage, face.tl (), face.br (), סולם חדש (0, 0, 255), 3); } saveImage (loadedImage, targetImagePath);

כאשר אנו מקלידים את תמונת המקור שלנו, כעת עלינו לקבל את תמונת הפלט עם כל הפרצופים המסומנים במלבן אדום:

7. גישה למצלמה באמצעות OpenCV

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

עם זאת, כדי שנוכל להציג תמונה מהמצלמה, אנו זקוקים לכמה דברים נוספים, מלבד המובן מאליו - מצלמה. כדי להציג את התמונות, נשתמש ב- JavaFX.

מכיוון שנשתמש ב- ImageView כדי להציג את התמונות שצילמה המצלמה שלנו, אנחנו צריכים דרך לתרגם OpenCV מַחצֶלֶת ל- JavaFX תמונה:

תמונה ציבורית mat2Img (Mat mat) {בתים MatOfByte = MatOfByte חדש (); Imgcodecs.imencode ("img", מחצלת, בתים); InputStream inputStream = ByteArray חדשInputStream (bytes.toArray ()); להחזיר תמונה חדשה (inputStream); }

הנה, אנו ממירים את שלנו מַחצֶלֶת לבתים, ואז להמיר את הבתים ל- תמונה לְהִתְנַגֵד.

נתחיל בהזרמת תצוגת המצלמה ל- JavaFX שלב.

כעת, בוא נתחל את הספרייה באמצעות ה- loadShared שיטה:

OpenCV.loadShared ();

הבא, אנחנו ליצור את הבמה עם VideoCapture ו ImageView כדי להציג את תמונה:

לכידת VideoCapture = VideoCapture חדש (0); ImageView imageView = ImageView חדש (); HBox hbox = HBox חדש (imageView); סצנת סצנה = סצנה חדשה (hbox); stage.setScene (סצנה); stage.show ();

פה, 0 הוא מזהה המצלמה שאנו רוצים להשתמש בה. אנחנו גם צריכים ליצור AnimationTimerלטיפול בהגדרת התמונה:

AnimationTimer חדש () {@Override ידית חלל ציבורית (ארוכה l) {imageView.setImage (getCapture ()); }} .תחל ();

לבסוף, שלנו getCapture ידיות בשיטה להמיר את מַחצֶלֶת ל תמונה:

תמונה ציבורית getCapture () {Mat mat = Mat New (); capture.read (מחצלת); להחזיר mat2Img (מחצלת); }

היישום אמור ליצור חלון ואז להזרים את הנוף מהמצלמה לשידור חי imageView חַלוֹן.

8. זיהוי פנים בזמן אמת

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

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

בואו פשוט לשנות את שלנו getCapture שיטה לביצוע גם זיהוי פנים:

תמונה ציבורית getCaptureWithFaceDetection () {Mat mat = Mat New (); ללכוד.קרא (מחצלת); Mat haarClassifiedImg = detectFace (mat); להחזיר mat2Img (haarClassifiedImg); }

כעת, אם אנו מריצים את היישום שלנו, יש לסמן את הפנים במלבן האדום.

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

9. סיכום

במדריך זה למדנו כיצד להשתמש ב- OpenCV בג'אווה.

השתמשנו במסווג מפל מאומן מראש כדי לזהות פנים בתמונות. בעזרת JavaFX הצלחנו לגרום למסווגים לזהות את הפנים בזמן אמת בעזרת תמונות מהמצלמה.

כמו תמיד ניתן למצוא את כל דגימות הקוד ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found