نمایش دو تصویر به صورت افقی یا عمودی در کنار هم در یک پنجره‌ی OpenCV

خیلی وقت‌ها پیش میاد که دوست داریم  دو یا چند تصویر رو در یک پنجره‌ی OpenCV  در کنار هم نمایش بدیم، مثلا می خواهیم تصویر اصلی رو در کنار تصویر نویزی ببینیم.

به شکل خیلی جالبی خود دستور imshow کتابخانه‌ی OpenCV این امکان رو در اختیامون قرار نمی‌ده، اما به همین نسبت راه‌حل هم آسونه!

در ادامه یک تابع خیلی ساده می‌نویسیم که بیاد و دوتا عکس رو درکنار هم برامون نمایش بده، دقیقا همین روش رو برای چندتا تصویر هم می‌تونیم بکار ببریم.

برای اینکه تصاویرمون رو در کنار هم داشته باشیم کافیه یک عکس جدید تولید کنیم و توی اون عکس تصاویرمون رو به چنین دلخواه کنار هم قرار بدیم، بقیه‌ی مسیر هم که ساده‌س، عکس‌ جدید رو نمایش می‌دیم!

این تابع با استفاده از دستورات hconcat و یا vconcat کتابخانه‌ی OpenCV میاد و دوتا عکس هم اندازه رو به شکل افقی یا عمودی در کنار هم قرار میده:

def concat_images(img1, img2, direction='H'):
    assert img1.shape == img2.shape , "Both images MUST be in same shape!"
    if direction == 'H':
        new_img = cv2.hconcat([img1, img2])
    elif direction == 'V':
        new_img = cv2.vconcat([img1, img2])
    else:
        print('Plese use [V] or [H] for direction')
    return new_img

معرفی متغیرهای تابع:

img1: تصویر اول
img2: تصویر دوم
direction: جهت کنار هم قرار گرفتن تصاویر که افقی باشه یا عمودی

دیگه کاری نمونده! وقتشه پنجره‌ی OpenCV کذا رو بسازیم و تصویر جدید رو نمایش بدیم، کد برنامه به شکل زیر است:

# کتابخانه‌ی OpenCV رو فرا می‌خونیم
import cv2

# یک تابع تعریف کردیم که کل کارش نمایش عکس و صبر کردنه.
def show_image_and_wait(title, image, resize_scale=None):
    if resize_scale:
        disp_img = cv2.resize(image, (0, 0), None, resize_scale, resize_scale)
    else:
        disp_img = image
    key = 0
    while True:
        cv2.imshow(title, disp_img)
        
        key = cv2.waitKey(1) & 0xFF
        if key == 27:
            print('<ESC> pressed')
            break
        elif key == ord('q'):
            print('<q> pressed')
            break
            
        if cv2.getWindowProperty(title ,cv2.WND_PROP_VISIBLE) < 1:    
            print('Close (X) button clicked')            
            break  

    cv2.destroyWindow(title)

# تصویر اول رو می‌خونیم و مطمعن می‌شیم فایلش وجود داره
img1_path = 'goldenـkamuy.jpg'
img1 = cv2.imread(img1_path, cv2.IMREAD_UNCHANGED)
if img1 is None:
        raise ValueError('Coud not open or find the image')

# تصویر دوم رو می‌خونیم و مطمعن می‌شیم فایلش وجود داره
img2_path = "goldenـkamuy_noisy.jpg"
img2 = cv2.imread(img2_path, cv2.IMREAD_UNCHANGED)
if img2 is None:
        raise ValueError('Coud not open or find the image')

# دوتا تصویر رو در کنار هم به شکل عموی ونمایش می‌دیم
# برای اینکه تصاویر توی صفحه جا بشن با نسبت ۰.۱۵ کوچیک شدن
show_image_and_wait('mh-salari.me', concat_images(img1, img2, 'V'), 0.15)

پ.ن: میشه از matplotlib و … هم استفاده کرد، اون موقع نیازی نیست نگران هم اندازه بودن عکس‌ها باشیم، ولی خوب، ابنم یه راهشه 🙂

+ اگر در مورد باز کردن و ذخیره تصویر در OpenCV  سوالی دارید قبلا +اینجا در موردش صحبت کردم.

منابع:

https://docs.opencv.org/3.4/d2/de8/group__core__array.htmlhttp://answers.opencv.org/question/175912/how-to-display-multiple-images-in-one-window/

https://stackoverflow.com/questions/35003476/opencv-python-how-to-detect-if-a-window-is-closed


نویسنده: محمد حسین سالاری

موارد مشابه

۱ دیدگاه

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *