GO THE DISTANCE!

세 번째, OpenCV 기초 - 영상 출력 - 국비지원무료교육

by makeany

영상 출력은 Matplotlib를 이용한다.

Matplotlib 라이브러리는 데이터 분석에서 그래프를 그릴때 주로 사용한다. OpenCV에서는 영상을 출력할 때 사용.

1. Matplotlib 설치

pip install matplotlib

 

중요 포인트!

 

컬러 영상 출력 시,
cv2.imread() 함수로 불러온 영상의 색상 정보는 BGR 순서이므로 이를 RGB 순서로 변경해야 함

cv2.imread() -> BGR
cv2.cvtColor() -> RGB
cv2.cvtColor() 함수 이용

왜 OpenCV는 BGR을 사용하는가?

답: OpenCV가 만들어질 당시에는 카메라 제조업체와 소프트웨어 개발자 간에 BGR이 대세였으니까.

출처: https://learnopencv.com/why-does-opencv-use-bgr-color-format/

 

Why does OpenCV use BGR color format ? | LearnOpenCV #

One of the elements of good design is the principle of least astonishment ( a.k.a principle of least surprise). A good intuitive design makes the user not think. When you see a handle on a door, you want to pull it. When you see a door with a metal plate,

learnopencv.com

그건 왜 미국 철도 레일 간격이 4 feet 8.5 inches 라는 애매한 홀수의 규격을 가지게 되었나? 라는 질문의 답과 유사하다. 미국 철도를 설계할 당시 기술자들은 영국에서 건너왔고 영국의 마차 바퀴 간격이 바로 4피트 8.5인치였다. 그 바퀴 간격은 2000년 로마시대 때의 마차 간격과 일치하는데 로마 시대 때 말 두마리가 넉넉히 지나갈 정도의  폭이 4피트 8.5인치였고 그 규격대로 로마는 길을 만들었다. 영국의 기술자들은 바퀴가 도로를 지날때 걸리적거리거나 들어맞지 않는 것을 염려했기 때문에 그 규격을 그대로 사용했다. 그리고 훗날, 미국에서 왕복우주선의 부스터로켓을 만들때 이 규격을 참고했다. 왜냐하면 로켓을 이동할 때 철도를 이용해야 했으므로 터널을 지나기 위해선 부득이하게 그 사이즈를 맞춰야 했다. 

결국 첨단 장비 설계를 2000년 전 말 엉덩이가 결정했다는 이야기다. Because of Roman horse’s ass!


2. 그레이 스케일 영상 출력

plt.imshow() 함수에서 컬러맵을 cmap='gray' 으로 지정

import matplotlib.pyplot as plt
import cv2
#컬러 영상 출력을 BGR에서 RGB로 변환
imgBGR = cv2.imread('blackpink.jpg')
imgRGB = cv2.cvtColor(imgBGR,cv2.COLOR_BGR2RGB)
# Matplotlib의 그래프 속성 지우기
plt.axis('off')
plt.imshow(imgRGB)
plt.show()
#그레이스케일영상출력
imgGray = cv2.imread('blackpink.jpg',cv2.IMREAD_GRAYSCALE)
# 그래프 속성 지우고 cmap으로 그레이 스케일 출력하기
plt.axis('off')
plt.imshow(imgGray,cmap='gray')
# 화면에 표시하는 기능
plt.show()

 

  • 결과값

 

3. Matplotlib를 이용하여 창 하나에 여러 개의 이미지 출력하기

import matplotlib.pyplot as plt
import cv2
#컬러 영상 & 그레이 스케일 영상 불러 오기
imgBGR = cv2.imread('blackpink.jpg')
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
imgGray = cv2.imread('blackpink.jpg', cv2.IMREAD_GRAYSCALE)
#두 개의 영상을 함께 출력
plt.subplot(121), plt.axis('off'), plt.imshow(imgRGB)
plt.subplot(122), plt.axis('off'), plt.imshow(imgGray, cmap='gray')
plt.show()

 

  • 결과값

 

4. 이미지 슬라이드 쇼

특정 폴더에 있는 모든 이미지 파일을 이용하여 슬라이드 쇼를 수행

* 구현할기능

  • 특정 폴더에 있는 이미지 파일 목록 읽기
  • 이미지를 전체 화면으로 출력 하기
  • 일정 시간 동안 이미지를 화면에 출력하고, 다음 이미지로 교체 하기 (무한루프)

 

A. 특정폴더에있는이미지파일(*.jpg)목록읽기

특정 폴더에 있는 이미지 파일(*.jpg) 을 읽는 방법 두가지.


os.listdir()

import os
file_list= os.listdir('.\\images')
img_files= [os.path.join('.\\images', file)
for file in file_list if file.endswith('.jpg')]

 

glob.glob()

# 폴더 내 파일 목록을 가져오는 재귀 함수
import glob
# glob(찾을 파일 경로 *.jpg) -> jpg 확장자 파일만 읽음
img_files = glob.glob('.\\images\\*.jpg')

 

B. 전체 화면 영상 출력창 만들기
먼저 cv2.WINDOW_NORMAL 속성창을 만든 후, cv2.setWindowProperty() 함수를 사용하여 전체 화면 속성으로 변경

# image라는 창 만들기
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# 창을 풀스크린으로 만들기
cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

 

C. 불러온 영상을 반복적으로 출력하기

cnt = len(img_files)
idx = 0
while True:
img = cv2.imread(img_files[idx])
if img is None:
print('Image load failed!')
break
cv2.imshow('image', img)
if cv2.waitKey(1000) >= 0:
break
idx += 1
if idx >= cnt:
idx = 0

 

* 전체 코드

import os
import sys
import glob
import cv2
img_files = glob.glob('.\\images\\*.jpg')
for f in img_files:
print(f)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setWindowProperty('image', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
cnt = len(img_files)
idx=0
while True:
img= cv2.imread(img_files[idx])
cv2.imshow('image', img)
if cv2.waitKey(1000) == 27: # ESC
break
idx += 1
if idx >= cnt:
idx = 0
cv2.destroyAllWindows()

스마트인재개발원 홈페이지 주소는? 바로 여기!!!
 

스마트인재개발원

4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관

www.smhrd.or.kr

블로그의 프로필 사진

블로그의 정보

막만들자!

makeany

활동하기