본문 바로가기

Python/OpenCV

OpenCV) 카메라로부터 비디오 읽어서 저장하기(코드 분석)

import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('prj_test.avi', fourcc, 30.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()

    if(ret) :
        cv2.imshow('video', frame)
        out.write(frame)

        if cv2.waitKey(1) == ord('q'):
            break
    
    else:
        print('error')
        break

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

 

1. VideoCapture

OpenCV에서 동영상 입력 부분을 관리하는 함수이다. 인자로는 filename, device를 받을 수 있다.

parameter 내용
filename 동영상 파일명 또는 이미지 파일명
device 연결된 영상 장치 index

※ device에서 기본 카메라를 기본 방법으로 열려면 index에 0을 넣으면 된다. 그 외에는 장치 관리자에 등록되어 있는 카메라 순서대로 index가 설정되어 있다.

 

2. VideoWriter 클래스

1) VideoWriter_fourcc 함수

4-문자 코드를 인자로 받으며 동영상 파일의 코덱, 압축 방식, 색상, 픽셀 포맷 등을 정의하는 정수 값을 의미한다.

cv2.VideoWriter_fourcc(* 'DIVX' ) DIVX MPEG-4 코덱
cv2.VideoWriter_fourcc(* 'XVID' ) XVID MPEG-4 코덱
cv2.VideoWriter_fourcc(* 'FMP4' ) FFMPEG MPEG-4 코덱
cv2.VideoWriter_fourcc(* 'X264' ) H.264/AVC 코덱
cv2.VideoWriter_fourcc(* 'MJPG' ) Motion-JPEG 코덱

 

2) VideoWriter 함수

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

- filename: 비디오 파일 이름

- fourcc: fourcc(ex: cv2.VideoWriter_fourcc(* 'DIVX'))

- fps: 초당 프레임 수

- frameSize: 프레임 크기로 튜플(width, height)로 입력

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

 

3) cv2.VideoWriter.Write(image)

프레임을 저장하는 함수

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

 

3. isOpened 함수

비디오 파일이 준비되었는지 확인하는 함수로 성공하면 True, 실패하면 False를 반환한다.

 

4. ret, frame = cap.read()

비디오를 한 프레임씩 읽는다. 제대로 프레임을 읽으면 ret 값이 True, 실패하면 False가 된다.

frame에는 읽은 프레임이 나온다.

 

5. imshow 함수

cv2.imshow(title, image)

title: 윈도우 창의 제목

image: numpy.ndarray 타입으로 위 코드에서는 frame을 가져온다.

 

6. waitKey 함수

키 입력을 기다리는 대기 함수이다. 매개변수로 넘긴 시간 안에 키를 입력하면 소스의 다음 줄로 이동한다. 만약 시간안에 키를 입력하지 않으면 넘어간다. Thread.sleep() 함수와 같이 정해진 시간만큼 소스 진행을 멈추는 역할을 한다.

 

위의 그림은 waitKey()의 리턴 값은 키보드로 입력한 키와 동일한 아스키 값이다. 아스키 값으로 어떤 key를 눌렀는지 알 수 있다. 만약 72가 리턴된다면 'H' 키를 누른 것으로 판단할 수 있다.

 

7. release 함수

cap.release() : 오픈한 VideoCapture 객체를 해제한다.

out.release() : 오픈한 VideoWriter 객체를 해제한다.

 

8. destroyAllWindows 함수

화면에 나타난 윈도우를 종료하는 함수이다.