안녕하세요. 지난 포스팅의 Opencv 제대로 쓰기[1]에서는 컴퓨터 내부에 있는 영상이나 동영상을 불러오는 방법에 대해서 정리했습니다. 이번 포스팅에서는 노트북이나 핸드폰의 카메라로부터 동영상을 불러오는 방법에 대해서 알아보겠습니다. 전체 코드는 아래의 깃허브 링크를 참조해주시길 바랍니다.
시작하기에 앞서 동영상을 불러오고 저장하는 핵심함수들에 대해서 간단하게 정리하고 넘어가도록 하겠습니다.
- cv2.VideoCapture() (int or str): VideoCapture Object를 생성하는 함수입니다. 변수로는 camera device index나 동영상의 파일명을 넘겨줍니다.
- VideoObject.get() (int): 동영상 객체의 속성을 얻는(get) 메서드입니다. 아직 저희가 opencv를 많이 다루어보지 않았기 때문에 get 함수에 정수형 인자로 3을 넘겨주면 입력받는 동영상의 너비(cv2.CAP_PROP_FRAME_WIDTH), 4를 넘겨주면 높이(cv2.CAP_PROP_FRAME_HEIGHT)를 얻을 수 있습니다.
- cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor) (str, int, double, Size, bool) : VideoWriter Object를 생성하는 함수입니다. 입력 변수는 각각 저장할 파일명(filename), codec 종류(fourcc), 초당 프레임(frame per sec)(fps), 동영상 프레임의 크기(frameSize), 컬러로 읽을 것인지에 대한 불 변수(isColor)를 의미합니다.
- cv2.VideoWriter_fourcc(c1, c2, c3, c4) (char, char, char, char) : Video를 저장할 codec의 종류를 정해줍니다. 해당 함수는 본인의 OS 환경에 따라서 달라지며 맥OS이신분들은 MJPG, 윈도우 OS이신분들은 DVIX로 넘겨주어야 정상적으로 저장됩니다.
1. 노트북 카메라로 동영상 입력받기
컴퓨터 내에 있는 동영상을 불러오는 방법은 cv2.VideoCapture()의 인자를 불러올 동영상의 경로 및 파일명으로 지정하면 됩니다. 만약, 노트북 카메라로 동영상을 입력받고 싶다면 camera device index를 0으로 넘겨주면 됩니다. 0이 의미하는 것은 노트북에 내장된 카메라의 고유 지정 번호입니다. 나머지는 이전 포스팅의 함수들과 완전히 동일합니다. while문을 이용해서 계속 불러오면서 cv2.imshow 함수를 통해 프레임을 계속 보여주는 것이죠. 아주 간단하죠? 여기서 절대 주의하실점은 제가 아래 코드에서 cv2.cvtColor() 함수를 이용해서 칼라에서 그레이스케일 영상으로 바꾸었습니다. 따라서 저장할 때는 단채널로 해주어야하기 때문에 cv2.VideoWriter()의 파라미터 중 isColor=False로 설정해주어야 제대로 저장됩니다.
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(3)) # 가로 길이 가져오기
height = int(cap.get(4)) # 세로 길이 가져오기
fps = 20
fcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
out = cv2.VideoWriter('webcam.avi', fcc, fps, (width, height), isColor=False)
print(out.isOpened())
while (True) :
ret, frame = cap.read()
if ret :
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out.write(gray)
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q') : break
else :
print("Fail to read frame!")
break
cap.release()
out.release()
cv2.destroyAllWindows()
만약, 맥북 + VSCode 환경에서 cv2.VideoCapture(0) 자체가 동작하지 않는다면 VSCode에 카메라 권한이 할당되어 있지 않은 상태를 의미합니다. 이 경우에는 아래의 링크를 참조해서 환경설정을 다시 해주시면 잘 됩니다.
2. 핸드폰 카메라로 동영상 입력받기
이번에는 핸드폰 카메라로 웹캠을 설정하여 동영상을 불러오도록 하겠습니다. 이를 위해 가장 먼저 해주셔야할 것은 핸드폰에 "이리언"이라는 어플을 설치해주셔야 합니다. 핸드폰에 설치했다면 본인의 컴퓨터에도 OS에 맞춰서 설치해주시면 됩니다. 이때 주의할 점은 핸드폰과 노트북이 동일한 와이파이로 접속된 상태여야한다는 점입니다. 그러면 코드는 위의 노트북에서 받는 거랑 100% 똑같습니다. 그러면 아래와 같은 동영상을 저장할 수 있습니다.
참고자료
[1].opencv VideoCapture
[2]. OpenCV : Flags for video I/O
'Programming > Python' 카테고리의 다른 글
Opencv 제대로 쓰기[4].흐림 처리 (0) | 2021.05.23 |
---|---|
Opencv 제대로 쓰기[3].외부 카메라 동영상 스크린샷 저장하기 (0) | 2021.05.01 |
Opencv 제대로 쓰기[1] - 컴퓨터 내 영상/동영상 입출력 (0) | 2021.04.17 |
Opencv 제대로 쓰기[0] - Opencv-python 설치 및 환경설정 (1) | 2021.04.11 |
Sympy 알고 쓰자 - polynomial Simplify (0) | 2020.12.31 |