세 번째, 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