ספריית OpenCV Python אפשרה להפוך את תהליך המיזוג של מספר תמונות לתמונה פנורמית אחת.

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

בעזרת Python תוכלו להפוך את התהליך הזה לאוטומטי וליצור פנורמות יפות בקלות.

הגדרת סביבת הפייתון שלך

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


pip להתקין opencv-contrib-python

אתה תשתמש ב opencv-contrib-python ספרייה כדי לטעון תמונות ולתפעל אותן. יש לו את cv2.Stitcher מחלקה שבה תשתמש כדי ליצור את הפנורמות.

קוד המקור המלא ותמונות לדוגמה המשמשות במאמר זה זמינים כאן מאגר GitHub.

ייבוא ​​הספריות הנדרשות

ייבא את cv2 ו OS מודולים לתוך הסקריפט שלך. תשתמש במערכת ההפעלה כדי לנווט בנתיבי המערכת.

יְבוּא cv2
יְבוּא OS

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

טוען את התמונות

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

instagram viewer


defטוען תמונות(נתיב_תיקייה):
# טען תמונות מתיקיה ושנה את גודלן.
תמונות = []
ל שם קובץ ב os.listdir (נתיב_folder):
# בדוק אם הקובץ הוא קובץ תמונה
אם filename.endswith('.jpg') אוֹ filename.endswith('.png'):
# טען את התמונה באמצעות OpenCV ושנה את גודלה
image = cv2.imread (os.path.join (folder_path, filename))
images.append (תמונה)
לַחֲזוֹר תמונות

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

שינוי גודל התמונות לקבלת תפירה אחידה ועיבוד מהיר יותר

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


defשינוי גודל_תמונות(תמונות, רוחב, גובה):
resized_images = []
ל תמונה ב תמונות:
resized_image = cv2.resize (תמונה, (רוחב, גובה))
resized_images.append (resized_image)
לַחֲזוֹר resized_images

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

שימוש במודול Stitcher של OpenCV כדי לתפור את התמונות

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


defstitch_images(תמונות):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (תמונות)
אם status == cv2.STITCHER_OK:
לַחֲזוֹר תמונה_תפורה
אַחֵר:
לַחֲזוֹראף אחד

אם התפירה הצליחה (כפי שמצוין על ידי cv2.STITCHER_OK קוד מצב), הפונקציה תחזיר את התמונה התפורה. אחרת, זה יחזור אף אחד.

חיתוך התמונה התפורה

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


defחתוך תמונה(תמונה):
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (אפור, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (קווי מתאר[0])
cropped_image = תמונה[y: y + h, x: x + w]
לַחֲזוֹר תמונה_חתוכה

התמונה התפורה נחתכת באמצעות המלבן התוחם.

תצוגה מקדימה ושמירה של התמונה התפורה באמצעות OpenCV

צור פונקציה שתציג את התמונה התפורה בחלון אינטראקטיבי ותשמור אותה בדיסק.


defתצוגה_מקדימה_ו_שמור_תמונה(תמונה, תיקייה_נתיב, שם_תיקייה):
# הצג את התמונה התפורה
cv2.namedWindow('תמונה תפורה', cv2.WINDOW_NORMAL)
cv2.imshow('תמונה תפורה', תמונה)
cv2.waitKey(0)

# שמור את התמונה התפורה
output_filename = os.path.join (תיקייה_נתיב, שם_תיקייה + '_panorama.jpg')
cv2.imwrite (שם_קובץ_output, תמונה)
הדפס('תמונה תפורה נשמרה עבור תיקיה:', folder_name)

תמונת הפנורמה נשמרת באותה תיקיה המכילה את התמונות המקוריות.

שליטה בזרימת התוכנית שלך

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


defתיקיית_stitch(folder_path, width=800, גובה=800):
# תפור את כל התמונות בתיקייה ושמור את התוצאה.
# טען את התמונות מהתיקיה
images = load_images (folder_path)

# בדוק אם יש לפחות שתי תמונות בתיקייה
אם len (תמונות) < 2:
הדפס('אין מספיק תמונות בתיקייה:', folder_path)
לַחֲזוֹר

# שנה את גודל התמונות
resized_images = resize_images (תמונות, רוחב, גובה)

# תפור את התמונות
stitched_image = stitch_images (שינוי גודל_תמונות)
אם תמונה_תפורה הואאף אחד:
הדפס('התפירה של התיקייה נכשלה:', folder_path)
לַחֲזוֹר

# חתוך את התמונה התפורה
cropped_image = crop_image (תמונה_תפורה)

# תצוגה מקדימה ושמור את התמונה התפורה
folder_name = os.path.basename (folder_path)
preview_and_save_image (תמונה_חתוכה, נתיב_תיקייה, שם_תיקייה)

העבר את נתיב התיקיה המכילה את התמונות שברצונך לתפור.

stitch_folder('sample_images') 

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

ללא תכונות אלה, יהיה קשה ל-OpenCV ליישר את התמונות וליצור פנורמה חלקה.

בדיקת התוכנית שלך

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

תסתכל על הגבעה בתמונה הראשונה הזו.

בתמונה השנייה הזו, הגבעה נראית מעט. זה יוצר תכונה חופפת.

שמור את התמונות בתיקייה. העבר את נתיב התיקיה ל- תיקיית_stitch פונקציה לתפירה. ואז הפעל את התוכנית.

התוכנית תפרה את התמונות ויצרה תמונה פנורמית עם מבט רחב יותר של הסצנה. שימו לב שכדי ליצור את התמונה הפנורמית לעיל, נעשה שימוש בתשע תמונות שנמצאות במאגר GitHub הנ"ל.

מניפולציה של תמונות באמצעות OpenCV

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