OpenCV를 통한 대부분의 작업은 이미지를 읽고 처리한 결과를 표시해서 다른 파일로 저장하는 것으로 이루어진다. 또한, 장치와 연결된 카메라로부터 이미지나 영상 프레임을 읽는 API도 제공한다.

 

1. 이미지 저장

import cv2

cap = cv2.VideoCapture(0) # 카메라 장치 연결
if not cap.isOpened(): # 초기화 확인
    raise IOError("Can't open webcam")
while True:
    ret, frame = cap.read() # 프레임 읽기
    #frame = cv2.resize(frame, None, fx=0.7, fy=0.7)
    cv2.imshow('CAMERA', frame)
    if cv2.waitKey(1) == 27: # ESC의 ASCII : 27
        cv2.imwrite('output.jpg', frame)
        break
        
cap.release() # 캡처 자원 반납
cv2.destroyAllWindows()

cv2.VideoCaputre() 함수에 카메라 장치를 연결하기 위한 인덱스를 인수로 지정해서 카메라로 프레임을 읽도록 한다. 카메라가 1대라면 인수로 0을 입력한다. 카메라가 연결되지 않았다면 Can't open webcam이라는 에러 메시지가 출력된다 cap.read()는 영상 프레임을 읽는 함수다. ret은 프레임을 읽었는지에 대한 여부의 True/False를, frame은 프레임 이미지를 반환한다. 가운데에 주석 코드와 같이 frame 크기를 0.7배와 같이 조정할 수도 있다. CAMERA라는 제목으로 프레임을 출력하고 키보드 입력을 대기한다. ASCII 코드 27에 해당하는 Esc가 입력되는 순간의 이미지를 캡처해 output.jpg로 저장된다. cap.release()로 캡처된 자원을 반납하고, cv2.destroyAllWindows()로 화면을 닫는다.

 

코드 실행 화면(Capture)

 

2. 비디오 저장

import cv2
cap = cv2.VideoCapture(0)
form = cv2.VideoWriter_fourcc(*'XVID') # 비디오 인코딩 형식
output = cv2.VideoWriter('output.avi', form, 20.0, (640,  480)) # filename, 인코딩 포맷 문자, fps, frame 크기
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame")
        break
    output.write(frame) # 파일 저장
    cv2.imshow('CAMERA', frame)
    if cv2.waitKey(1) == 27:
        break
output.release() # 파일 닫기
cap.release()
cv2.destroyAllWindows()

영상을 저장하기 위해 cv2.VideoWriter()함수에 저장할 파일명, 인코딩 포맷 문자, fps, 프레임 크기를 인수로 지정한다. 여기서 인코딩 포맷 문자란 cv2.VideoWriter_fourcc()를 통해 비디오 인코딩 형식을 지정하게 된다. XVID란 MPEG-4 표준을 따르는 비디오 코덱 라이브러리로, 이러한 인코딩 형식에는 DIVX, MJPG 등 다양한 종류가 있다. 특히 DIVX와 XVID가 유사해보지만 DIVX는 Windows와 Mac에서만 지원되는 상용, XVID는 다양한 OS에서 지원되는 오픈소스인 점에서 차이를 보인다. cv2.VideoWriter()로 지정한 정보로 write() 함수를 통해 해당 프레임을 파일에 저장하도록 한다. 나머지 코드는 이미지 저장과 비슷하며, 영상을 저장할 때는 파일을 닫는 release()까지 추가해야 하는 것에 주의해야 한다. 인코딩 형식에 관한 추가적인 정보는 아래 사이트에서 확인할 수 있다.

 

* Reference

 

Video Codecs by FOURCC - fourcc.org

 

www.fourcc.org

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기