본문 바로가기

& 프로그래밍/& openCV

openCV 프로그래밍 기초(VideoWriter)

이전 포스팅에서 비디오 파일을 읽어오는 방법을 배웠다

 

이번에는 비디오파일을 녹화하는 방법을 알아보려 한다

자율주행 시스템은 카메라로부터 실시간으로 받는 영상정보를 인식하여 학습된 모델을 바탕으로 결과를 도출하는 방식인데 그 과정에 가장 핵심이면서 기본인 카메라를 컨트롤하는 방법을 배우는 것이다

 

1. 라이브러리 임포트

import cv2
import numpy as np

 

2. 카메라로부터 데이터를 가져온다

cap = cv2.VideoCapture(0)

#모듈 대소문자 주의
#0 : 0번 카메라를 의미

 

3. 카메라 연결상태 확인

if cap.isOpend() == False :
	print('Unable to read camera feed')

카메라가 정상적으로 연결되지 않았다면 해당 문구를 출력하여 안내하도록 if문을 걸어준다

 

3-1. 카메라 연결상태가 양호하다면

else :
	#프레임 정보를 가져온다 : 화면크기를 의미한다
    frameWidth = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 프레임 너비
    frameHeight = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 프레임 높이
    #framewidth = int(cap.get(3))
    #frameheight = int(cap.get(4))
    
    output = cv2.VideoWriter('data/videos/output.avi', cv2.VideoWriter_fourcc('M','J','P','G'),10,(frameWidth,frameHeight))
    
 

비디오파일 녹화 함수는 아래 표로 정리한다

함  수 설 명
cv2.VideoWriter(filename, fourcc, fps, frameSize)
(파일명, 코덱, 프레임 속도, 프레임사이즈)
비디오 출력 객체 생성
cv2.VideoWriter.write(image) 비디오 파일에 이미지 출력
cv2.VideoWriter.release() 비디오 출력 객체 해제

사용빈도가 높은 fourcc 비디오 코덱 문자도 아래 표로 정리한다

fourcc 코덱
cv2.VideoWriter_fourcc(*'PIM1') MPEG-1
cv2.VideoWriter_fourcc(*'MJPG') Motion-JPEG
cv2.VideoWriter_fourcc(*'DIVX') DIVX 4.0 이후 버전
cv2.VideoWriter_fourcc(*'XVID') XVID, MPEG-4
cv2.VideoWriter_fourcc(*'MPEG') MPEG
cv2.VideoWriter_fourcc(*'X264') H.264/AVC

4. 반복문을 활용하여 비디오 프레임을 캡처해서 받아올 수 있도록 설정한다

   while True:
          ret, frame = cap.read()
          if not ret :
              break

          out.write(frame)
          cv2.imshow('frame',frame)

          if cv2.waitKey(1) & 0xFF == 27:
              break

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

2번째 if문에서는 esc(27번)을 누르면 비디오 프레임을 캡처를 중지할 수 있도록 설정해주었다

 

- 전체코드

import cv2
import numpy as np

#캠으로부터 데이터 가져오기
cap = cv2.VideoCapture(0)

if cap.isOpened() == False:
    print('Unable to read camera feed')

else :
    #프레임 정보 가져오기 : 화면 크기
    frameWidth = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frameHeight = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    # framewidth = int(cap.get(3))
    # frameheight = int(cap.get(4))

    out = cv2.VideoWriter('data/videos/output.avi', cv2.VideoWriter_fourcc('M','J','P','G'),10
    

    while True:
        ret, frame = cap.read()
        if not ret :
            break

        out.write(frame)
        cv2.imshow('frame',frame)

        if cv2.waitKey(1) & 0xFF == 27:
            break
    
    cap.release()
    out.release()
    cv2.destroyAllWindows()

내,외장 카메라를 연결하여 실행시키면 실제로 카메라가 연결되면서 정상적으로 작동하는 걸 볼 수 있을 것이다