23년 겨울방학때 OpenCV에 대해 공부하면서 Velog에 정리했던 글들을 옮기는 중입니다. OpenCV 관련해서는 9개의 포스팅이 올라갈 예정입니다.
지금부터 올리는 OpenCV 관련 글은 배우는 입장으로 배운 내용에 대해 정리하는 글들이고, 출처는 패스트캠퍼스에서 황선규 박사님의 온라인 강의 'OpenCV를 활용한 컴퓨터비전과 딥러닝'입니다.
OpenCV의 시작
OpenCV란?
: Open Source Computer Vision의 약자로 영상 처리에 사용할 수 있는 Python 오픈 소스 라이브러리 이다.
OpenCV
OpenCV has 15 repositories available. Follow their code on GitHub.
github.com
한가지 예시 코드를 보면, 아래의 코드에서는 cv2 [OpenCV]의 version과 cat.bmp 사진 파일을 불러와서 새 창에 고양이 사진을 띄우는 간단한 코드이다.
import sys
import cv2
print('Hello OpenCV',cv2.__version__)
img=cv2.imread('cat.bmp') # cat.bmp를 불러와 img 변수에 저장
if img is None: # 영상 불러오기가 실패하면 에러 메시지를 출력하고 종료
print('Image load failed!')
sys.exit()
cv2.namedWindow('image') # 'image'라는 이름의 새창을 만듦
cv2.imshow('image',img) # 이 창에 img 출력
cv2.waitKey() # 키보드 입력이 있을 때까지 wait
cv2.destroyAllWindows() # 생성된 모든 창을 닫음
>>> Hello OpenCV 4.8.1

이렇게 영상을 불러와서 라이브러리에 있는 다양한 기능들로 이미지를 처리하는 것이 OpenCV를 배우는 목적이라고 생각한다.
흔히 볼 수 있는 크로마키 합성, 사후 보정 등이 예시에 해당한다.
함수 예시
이번엔 위의 예시 코드에서 쓰인 함수에 대해 설명하고자 한다.
영상 파일 불러오기
cv2.imread(filename, flags=None) -> retval
- filename : 불러올 파일명
- flags : 영상 파일 불러오기 옵션 플래그

- retval : 불러온 영상 데이터 [numpy.ndarray]
영상 파일 저장하기
cv2.imwrite(filename, img, params=None) -> retval
- filename : 저장할 영상 파일 이름 [문자열]
- img : 저장할 영상 데이터 [numpy.ndarray]
- params : 파일 저장 옵션 지정 [속성 & 값의 정수 쌍]
→ [cv2.IMWRITE_JPEG_QUALITY,90] : JPG 파일 압축률을 90%로 지정 - retval : 정상적으로 저장하면 True, 실패하면 False
새 창 띄우기
cv2.namedWindow(winname, flags=None) -> None
- winname : 창 고유 이름 [문자열]
- flags : 창 속성 지정 플래그

- winname : 닫고자 하는 창 이름
- 참고사항
- cv2.destroyWindow 함수는 지정한 창 하나만 닫는다.
- cv2.destroyAllWindows는 열려있는 모든 창을 닫는다.
- 일반적인 경우 프로그램 종료시 OS에 의해 열려 있는 모든 창이 자동으로 닫힌다.
창 위치 이동
cv2.moveWindow(winname, x, y) -> None
- winname : 창 이름
- x, y : 이동할 위치 좌표
창 크기 변경
cv2.resizeWindow(winname, width, height) -> None
- winname : 창 이름
- width : 변경할 창의 가로 크기
- height : 변경할 창의 세로 크기
- 참고 사항
- 창 생성시 cv2.WINDOW_NORMAL 속성으로 생성되어야 동작
- 영상 출력 부분의 크기 만을 고려함 [제목 표시줄, 창 경계는 고려 X]
영상 출력하기
cv2.imshow(winname, mat) -> None
- winname : 영상을 출력할 대상 창 이름
- mat : 출력할 영상 데이터 [numpy.ndarray]
- 참고 사항
- uint16, int32 자료형 행렬의 경우, 행렬 원소값을 255로 나눠서 출력
- float32, float64 자료형 행렬의 경우, 행렬 원소 값에 255를 곱해서 출력
⇒ 가급적 uint8 type를 지정해주는게 좋음
- 만약 winname에 해당하는 창이 없으면 창을 새로 만들어서 영상을 출력함
- Windows OS에서는 Ctrl+C, Ctrl+S 지원
- 실제로는 cv2.waitKey 함수를 호출해야 화면에 영상이 나타남
키보드 입력 대기
cv2.waitKey(delay=None) -> retval
- delay : 밀리초 단위 대기 시간. delay≤0 이면 무한히 기다림. 기본값은 0
- retval : 눌린 키 값 [ASCII code]. 키가 눌리지 않으면 -1
- 참고 사항
- cv2.waitKey 함수는 OpenCV 창이 하나라도 있을 때 동작함
- 특정 키 입력을 확인하려면 ord 함수를 이용
while True:
if cv2.waitKey()==ord('q'): # q를 누르면 종료
break
while True:
if cv2.waitKey()==27: # esc를 누르면 창이 닫힘
break
- 주요 특수키 코드 : 27 [ESC], 13 [ENTER], 9 [TAB]
import sys
import cv2
print('Hello OpenCV',cv2.__version__)
img=cv2.imread('cat.bmp',cv2.IMREAD_GRAYSCALE) # cat.bmp를 불러와 img 변수에 저장
if img is None: # 영상 불러오기가 실패하면 에러 메시지를 출력하고 종료
print('Image load failed!')
sys.exit()
cv2.imwrite('cat_gray.png',img,params=None)
cv2.namedWindow('image') # 'image'라는 이름의 새창을 만듦
cv2.imshow('image',img) # 이 창에 img 출력
cv2.waitKey() # 키보드 입력이 있을 때까지 wait => imshow랑 set라고 봐도 무방
cv2.destroyAllWindows() # 생성된 모든 창을 닫음
이번엔 한가지 달라진 부분이 있다. 두 번째 줄을 보면, image를 불러오는데 flag가 cv2.IMREAD_GRAYSCALE인 것을 확인할 수 있다. 이 의미는 cat.bmp 파일을 흑백영상으로 가져온다는 의미이다.
출력 영상을 확인해보면 다음과 같다.

이 두 image를 OpenCV가 아닌 matplotlib으로도 출력할 수 있다.
import matplotlib.pyplot as plt
import cv2
# 컬러 영상 출력
imgBGR = cv2.imread('cat.bmp')
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB) # BGR을 RGB 순서로 변경
plt.axis('off')
plt.imshow(imgRGB)
plt.show()
# 그레이스케일 영상 출력
imgGray = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
plt.axis('off') # off를 안하면 영상 가로 세로에 축이 생김
plt.imshow(imgGray, cmap='gray')
plt.show()
# 두 개의 영상을 함께 출력
plt.subplot(121), plt.axis('off'), plt.imshow(imgRGB) # 1행 2열 1번째
plt.subplot(122), plt.axis('off'), plt.imshow(imgGray, cmap='gray') # 1행 2열 2번째
plt.show()

실습
휴대폰을 보면 슬라이드쇼 기능이 있다. 여러장의 사진을 일정한 주기에 맞춰서 자동으로 보여주는 기능인데, OpenCV로 간단하게 구현을 해보았다.
import os
import sys
import glob
import cv2
# 이미지 파일을 모두 img_files 리스트에 추가
# os.listdir() 사용 방법
#file_list=os.listdir('.\\images')
#img_files=[os.path.join('.\\images',file)for file in file_list if file.endswith('.jpg')]
# glob.glob() 사용 방법
img_files = glob.glob('.\\images\\*.jpg')
if not img_files:
print("There are no jpg files in 'images' folder")
sys.exit()
# 전체 화면으로 'image' 창 생성
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])
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
cv2.destroyAllWindows()
images 폴더에 있는 .jpg 파일들을 fullscreen으로 슬라이드쇼 형식으로 보여주게 된다.
- Chapter 1 끝! -

'OpenCV' 카테고리의 다른 글
[OpenCV] 영상의 특징 추출 | 2025.04.04 |
---|---|
[OpenCV] 기하학적 변환 | 2025.04.04 |
[OpenCV] 필터링 | 2025.04.04 |
[OpenCV] 기본 영상 처리 | 2025.04.04 |
[OpenCV] OpenCV 기초 | 2025.04.04 |