1. 목표
- 영상을 읽고, 돌려보고, 저장하는 방법을 배워봅시다.
- 카메라 영상(웹캠이나, 비디오)을 읽어들이고 출력하는 방법을 배웝보시다.
- 여기서 다음 함수를 배우겠습니다. : cv2.VideoCapture(), cv2.VideoWriter()
2. 카메라(혹은 웹캠)에서 읽어보기
카메라로부터 실시간 스트리밍이 필요하다면 opencv에서 간단한 인터페이스(함수)를 제공하고 있습니다. 카메라로 부터 비디오 영상들을 캡처하여 이를 회색 영상으로 바꾸고 출력해보도록 하겠습니다.
비디오를 캡처하려면, VideoCapture라고 부르는 객체를 만들어야 합니다. 여기서 매개변수는 읽어들일 비디오 파일 이름이나 카메라 장치의 번호를 주면 됩니다. 장치 번호는 어느 카메라를 선택할건지 명시하는 요소입니다(보통 내장 웹캠은 0, 추가 usb 웹캠은 1, 2, 3 순으로) 비디오 캡처로 읽어들이면 프레임 단위로 확인할수 있으나, 작업이 다끝난후 자원을 해제하는걸 잊지 말아주세요
import cv2
cap = cv2.VideoCapture("/Users/jdo/Documents/GitHub/opencv_python/02day/horangnabi.mp4")
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
print(frame)
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
파일명 : 01_videocapture.py
- cap.read() 함수는 반환 결과 ret와 영상 한 프레임 frame을 반환합니다(위코드에서)
* 맥북에서 웹캠 스트리밍이 안되는 관계로 호랑나비 영상으로 대체
3, 비디오 저장하기
캡처한 비디오를 저장하는 방법은 간단하게도 cv2.imwrite()함수를 사용ㅎ가ㅣ만 하면 됩니다. 단지 여기서 추가적인 작업만 몇개 더함녀 되는데, videowrite 객체를 생성해 주면 됩니다. 여기서 출력할 파일 명을 명시해주고(ex. output.avi) FourCC를 정의하면 됩니다.
FourCC는 비디오 코덱을 설정하기 위한 4바이트 암호화기(?)로 fourcc.org에서 상세한 정보를 확인하실수 있겠습니다.
다음의 코덱들이 저의 경우에 사용가능 했었습니다.
- In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 gives very small size video)
- In Windows: DIVX (More to be tested and added)
- In OSX : (I don’t have access to OSX. Can some one fill this?)
FourCC 암호화기는 MJPG로 비디오를 저장하고자 할때 다음과 같이 명시하시면 되겠습니다.
-> cv2.VideoWriter_fourcc('M','J','P','G')
-> cv2.VideoWriter_fourcc(*'MJPG)
import numpy as np
import cv2
cap = cv2.VideoCapture("/Users/jdo/Documents/GitHub/opencv_python/02day/horangnabi.mp4")
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter('output.mp4',fourcc, 10.0, (492,360))
while(cap.isOpened()):
ret, frame = cap.read()
#print(frame.shape)
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
파일명 ; 02_savingvideo.mp4
- cv2.videowriter()를 명시할떄, 원본 영상과 동일한 해상도를 지정해 주어야 합니다.
=> 안하면 영상 저장이 제대로 안됨
'로봇 > 영상' 카테고리의 다른 글
opencv-python 튜토리얼 - 5. 마우스를 패인트 브러쉬로 사용하기 (0) | 2020.08.10 |
---|---|
opencv-python 튜토리얼 - 4. 그리기 함수 사용하기 (0) | 2020.08.10 |
opencv-python 튜토리얼 - 2. 이미지로 시작하기 (0) | 2020.08.10 |
opencv-python 튜토리얼 - 1. 소개 (1) | 2020.08.10 |
opencv-python 튜토리얼 - 0. 개요 (0) | 2020.08.09 |