본문 바로가기

코딩/파이썬 opencv

opencv-python 004. imshow()로 다중 이미지 다중 화면에 출력 (matplotlib 포함)

 

opencv-python 패키지의 imshow() 함수를 이용해 이미지를 하나 이상의 화면(윈도우)에 출력해 본다.

 

아래의 예제 코드 실행을 위해 관련된 이미지가 다음의 경로에 존재함을 전제로 한다.

 

예제 코드 1

<코드 1>

# python 3.9.6
# opencv-python 4.5.3.56

import cv2 as cv

img1 = cv.imread('image/view1.jpg', flags=cv.IMREAD_UNCHANGED)
img2 = cv.imread('image/view1.jpg', flags=cv.IMREAD_GRAYSCALE)
img3 = cv.imread('image/view2.jpg', flags=cv.IMREAD_UNCHANGED)
img4 = cv.imread('image/view2.jpg', flags=cv.IMREAD_GRAYSCALE)
img5 = cv.imread('image/food1.jpg', flags=cv.IMREAD_UNCHANGED)
img6 = cv.imread('image/food1.jpg', flags=cv.IMREAD_GRAYSCALE)

cv.imshow('image 1', img1)
cv.imshow('image 2', img2)
cv.imshow('image 3', img3)
cv.imshow('image 4', img4)
cv.imshow('image 5', img5)
cv.imshow('image 6', img6)

while True:
    key = cv.waitKey()
    print('key pressed :', int(key))
    if key == 49:  # 1
        cv.destroyWindow('image 1')
    elif key == 50:  # 2
        cv.destroyWindow('image 2')
    elif key == 51:  # 3
        cv.destroyWindow('image 3')
    elif key == 52:  # 4
        cv.destroyWindow('image 4')
    elif key == 53:  # 5
        cv.destroyWindow('image 5')
    elif key == 54:  # 6
        cv.destroyWindow('image 6')
    elif key == 27 or key < 0:  # ESC or all closed
        break

cv.destroyAllWindows()

 

 

<코드 1>을 실행하면 6개의 이미지가 화면에 출력되고 키보드 입력이 발생할 때까지 대기한다.

 

 key = cv.waitKey()

 

키보드에서 1번 키를 누르면 화면(윈도우) 이름이 'image 1'인 화면을 닫는다.

 

if key == 49:  # 1
    cv.destroyWindow('image 1')

 

출력된 모든 화면이 닫히면 cv.waitKey() 함수의 반환값은 -1이기에 아래의 코드로 while 문을 벗어나도록 한다.

 

elif key == 27 or key < 0:  # ESC or all closed
    break

예제 코드 2

<코드 2>

# python 3.9.6
# opencv-python 4.5.3.56
# matplotlib 3.4.3

import cv2 as cv
from matplotlib import pyplot

img = cv.imread('image/view1.jpg', flags=cv.IMREAD_COLOR)

pyplot.imshow(img)
pyplot.show()

 

 

<코드 2>는 데이터 시각화 파이썬 패키지(라이브러리) matplotlib를 이용해 이미지를 화면에 출력한다.

예제 코드 3

<코드 2>를 통해 화면에 출력되는 이미지의 색상이 원본과 달라 검색해 보니 OpenCV는 BGR(blue, green, red)을 사용하고 matplotlib는 RGB를 사용하기 때문에 이미지에서 R과 B의 위치를 서로 바꿔주어야 한다고 한다. 

 

<코드 3>

# python 3.9.6
# opencv-python 4.5.3.56
# matplotlib 3.4.3

import cv2 as cv
from matplotlib import pyplot

img = cv.imread('image/view1.jpg', flags=cv.IMREAD_COLOR)

b, g, r = cv.split(img)  # 방식 1
img = cv.merge([r, g, b])  # 방식 1
# img = cv.cvtColor(img, cv.COLOR_BGR2RGB)  # 방식 2

pyplot.imshow(img)
pyplot.show()