Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 동영상 저장하기 - cv2.VideoWriter 클래스

AI 꿈나무 2020. 9. 27. 10:45
반응형

황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.

 


동영상 저장하기 - cv2.VideoWriter 클래스

 cv2.VideoWriter 클래스를 이용해서 영상을 저장하는 방법을 알아보겠습니다.

 OpenCV에서는 cv2.VideoWriter 클래스를 이용하여 일련의 프레임을 동영상 파일로 저장할 수 있습니다.

 일련의 프레임은 모두 크기와 데이터 타입이 같아야 합니다.

 

 또한 Fourcc (4-문자 코드, four character code)를 지정해줘야 합니다.

 Fourcc는 동영상 파일의 코덱, 압축 방식, 색상, 픽셀 포맷 등을 정의하는 정수 값입니다.

 

1. 저장을 위한 동영상파일 열기

 영상을 저장하기 위해서는 cv2.VideoWriter 객체를 생성해야 합니다.

 

[명령어 설명]

cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None) -> retval

 

 저장하고 싶은 영상의 속성값을 지정해줘야 합니다.

 

filename : 비디오 파일 이름 (e.g. 'video.mp4')

fourcc : fourcc (e.g. cv2.VideoWriter_fourcc(*'DIVX'))

fps : 초당 프레임 수 (e.g. 30)

frameSize : 프레임 크기. (width, height) 튜플.

• isColor : 컬러 영상이면 True, 그렇지않으면 False. 기본값은 True입니다.

• retval : cv2.VideoWriter 객체

 

 

[예시 코드]

# 노트북 웹캠에서 받아오는 영상을 저장하기

# 기본 카메라 객체 생성
cap = cv2.VideoCapture(0)

# 열렸는지 확인
if not cap.isOpened():
    print("Camera open failed!")
    sys.exit()

# 웹캠의 속성 값을 받아오기
# 정수 형태로 변환하기 위해 round
w = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS) # 카메라에 따라 값이 정상적, 비정상적

# fourcc 값 받아오기, *는 문자를 풀어쓰는 방식, *'DIVX' == 'D', 'I', 'V', 'X'
fourcc = cv2.VideoWriter_fourcc(*'DIVX')

# 1프레임과 다음 프레임 사이의 간격 설정
delay = round(1000/fps)

# 웹캠으로 찰영한 영상을 저장하기
# cv2.VideoWriter 객체 생성, 기존에 받아온 속성값 입력
out = cv2.VideoWriter('output.avi', fourcc, fps, (w, h))

# 제대로 열렸는지 확인
if not out.isOpened():
    print('File open failed!')
    cap.release()
    sys.exit()

 

2. 프레임 저장하기 - cv2.VideoWriter.write(image)

 저장할 동영상 객체를 생성했으므로 프레임을 저장할 수 있습니다.

 

[명령어 설명]

cv2.VideoWriter.write(image) -> None

 

• image: 저장할 프레임 (numpy.ndarray)

 

[예시 코드]

# 프레임을 받아와서 저장하기
while True:                 # 무한 루프
    ret, frame = cap.read() # 카메라의 ret, frame 값 받아오기

    if not ret:             #ret이 False면 중지
        break

    inversed = ~frame # 반전

    edge = cv2.Canny(frame, 50, 150) # 윤곽선

    # 윤곽선은 그레이스케일 영상이므로 저장이 안된다. 컬러 영상으로 변경
    edge_color = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)

    out.write(edge_color) # 영상 데이터만 저장. 소리는 X

    cv2.imshow('frame', frame)
    cv2.imshow('inversed', inversed)
    cv2.imshow('edge', edge)

    if cv2.waitKey(delay) == 27: # esc를 누르면 강제 종료
        break

cap.release()
out.release()
cv2.destroyAllWindows()

 

 이처럼 웹캠으로 찰영한 영상이 저장된 것을 확인할 수 있습니다.

 비디오 프레임만 저장되므로 소리는 저장되지 않습니다.

저장된 영상

 

반응형