OpenCV 1: 이미지 및 카메라(사진, 동영상) 제어 메서드

컴퓨터 비전 라이브러리인 OpenCV의 메서드들을 정리한 글이다.

별도로 자세한 원리 설명은 생략하고, 간단히 메서드의 문법들을 정리했다.

이미지 읽기, 출력, 쓰기

# 이미지 읽기
cv2.imread(path, flag) 
	# flag: 0(cv2.IMREAD_GRAYSCALE, 흑백)
	# flag: 1(cv2.IMREAD_COLOR, 칼라, default)
	# flag: -1(cv2.IMREAD_UNCHANGED, 알파값도 같이 읽음)

# 이미지 출력(새 윈도우)
cv2.imshow(title, img) # img: numpy배열(cv2.imread()의 반환값)

# 이미지 출력(matplot)
img = cv2.imread(fname, cv2.IMREAD_COLOR)
plt.imshow(img)
plt.show() # 주의: opencv는 색상을 [b,g,r]순서, matplot등 대부분의 경우는 [r,g,b]로 색상 표현
		   # 따라서, 원본 이미지와 색상이 다르게 나타난다. 별도로 cvtcolor를 해주어야 한다. 

# 이미지 쓰기
cv2.imwrite(fname, img) # fname: 파일명


카메라 제어

  1. VideoCapture 객체 생성. 0이면 컴퓨터에 연결된 카메라를 자동으로 탐색, 연결
  2. loop를 돌며 frame을 읽어옴
  3. 읽은 frame에 대해서 변환작업 수행, 화면에 출력
  4. VideoCapture를 release(종료)하고 window를 닫는다.
# 사진 찍기
cap = cv2.VideoCapture(0) # 카메라 open
cap.isOpened() # bool, 카메라 오픈시 True 반환
cap.set(가로/세로 상수, 크기) # 가로(3), 세로(4) 입력. 영상의 사이즈 세팅
cap.get(가로/세로 상수) # 가로(3), 세로(4). 영상의 사이즈값 반환
ret, frame = cap.read() # 영상 읽기. ret: 처리결과(bool), frame: 읽어온 영상(1프레임)
# 동영상 관련
cv2.VideoWriter('파일명', 코덱종류, 초당 프레임 , 가로세로 크기) # 영상저장 객체
cv2.VideoWriter_fourcc(*'DIVX') # 사용할 코덱 지정

# 동영상 찍기/저장 실습
import cv2
cap = cv2.VideoCapture(0) # 카메라 open(비디오캡처 객체 생성)
codec = cv2.VideoWriter_fourcc(*'DIVX') #사용할 코덱 생성
out = cv2.VideoWriter('a.avi', codec, 25.0, (640,480)) # 동영상 저장 객체 생성
while cap.isOpened(): # 카메라 정상 오픈일 때 동작
    ret, frame = cap.read() # 카메라 영상 읽기
    if ret: # abs읽기가 정상이면
        out.write(frame) # 동영상파일 작성
        cv2.imshow('frame', frame) # 현재 frame을 윈도우에 출력
        if cv2.waitKey(1) & 0xFF == ord('q'): # q입력 시 종료 
            break
    else:
        break
cap.release() # 비디오캡처 객체 릴리즈
out.release() # 동영상 저장 객체 릴리즈
cv2.destroyAllWindows() # 창을 닫아줌

# 동영상 읽기
cap = cv2.VideoCapture('a.avi') # 동영상 파일 오픈
while cap.isOpened(): # 동영상 파일이 정상 오픈이면
    ret, frame = cap.read() # 동영상에서 frame을 읽음
    if not ret:
        break
    cv2.imshow('a.avi', frame) # 읽은 frame을 윈도우에 출력
    if cv2.waitKey(42) & 0xFF == ord('q'): # q입력 시 종료 
        break
cap.release()
cv2.destroyAllWindows()

Leave a comment