본문 바로가기

Dev/PYTHON 파이썬

[OpenCV] 동영상 재생하기 | 웹캠 재생하기 | 웹캠으로 들어온 영상 저장하기 (VideoCapture, VideoWriter)

728x90
반응형

 

동영상은 일련의 정지 영상을 압축하여 파일로 저장한 형태를 의미

이 때 동영상에 저장되어있는 일련의 정지 영상을 프레임(frame)이라고 함

 

따라서 동영상을 처리하는 방법은 동영상에서 프레임을 추출한 후, 각각의 프레임에 영상 처리 기법을 적용하는 것

→ 웹캠도 동일하게 카메라로부터 일정 시간 간격으로 정지 영상 프레임을 받아와서 처리

 

OpenCV에서는 VideoCapture라는 클래스를 이용하여

카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아올 수 있음

 

1. 동영상 파일 읽어와서 재생하기
import cv2

videoFile = '../datasets/video2_meat.mp4' #read video file
cap = cv2.VideoCapture(videoFile) #load as a VideoCapture class

while(cap.isOpened()): #Check Video is Available
	ret, frame = cap.read() #read by frame (ret=TRUE/FALSE)

	if ret:
		cv2.imshow('VIDEO', frame)
		if cv2.waitKey(10) & 0xFF == ord('q'): #wait 10ms until user input
			break
	else:
		print("ret is false")
		break

cap.release() #release memory
cv2.destroyAllWindows() #destroy All Window
  • 비디오 파일이 위치해있는 경로를 videoFile 변수에 저장
  • VideoCapture 클래스를 사용하여 cap 객체로 비디오를 불러온다
  • 동영상이 cap 객체로 정상적으로 불러와졌으면 while문을 돌면서 각 프레임별로 재생한다
  • cap.read(): 동영상을 프레임 별로 읽는다. 정상적으로 불러와졌으면 ret에는 TRUE 값이 저장되고, 그렇지 않으면 FALSE 값이 저장된다
  • cv2.waitKey(10) & 0xff == ord('q'): 키보드 'q' 입력이 들어올 때까지 10ms 대기. 괄호 안의 숫자가 커지면 영상 재생 속도가 느려지고, 숫자가 작아지면 영상 재생 속도가 빨라진다
  • cap.release(): 영상 재생이 끝나면 cap 객체가 차지하고 있던 메모리를 해제한다
  • cv2.destroyAllWindows(): 켜져있던 모든 윈도우 재생창을 종료한다

 

2. 웹캠 재생하기
import cv2

cap = cv2.VideoCapture(0) #load WebCamera
print('width:', cap.get(3), ' height:', cap.get(4))

while(cap.isOpened()): #Check Video is Available
	ret, frame = cap.read() #read by frame (ret=TRUE/FALSE)

	if ret:
		cv2.imshow('VIDEO', frame)
		if cv2.waitKey(1) & 0xFF == ord('q'): #wait 10ms until user input
			break
	else:
		print("ret is false")
		break

cap.release() #release memory
cv2.destroyAllWindows() #destroy All Window
  • 웹캠을 불러와 재생하는 것도 비디오 재생과 크게 다르지 않다! VideoCapture() 함수에 동영상 경로가 아닌 0을 넣어주면 보통 카메라, 웹캠으로 연결된다
  • print를 사용하여 웹캠의 가로, 세로 길이를 확인할 수도 있다
  • 이후의 내용은 동영상 불러오기와 동일하다

 

3. 웹캠 영상을 좌우 반전시켜 저장하기
import cv2

#Load Web Camera
cap = cv2.VideoCapture(0) #load WebCamera
if not (cap.isOpened()):
	print("File isn't opend!!")

#Set Video File Property
videoFileName = 'output.avi'
w = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # width
h = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #height
fps = cap.get(cv2.CAP_PROP_FPS) #frame per second
fourcc = cv2.VideoWriter_fourcc(*'DIVX') #fourcc
delay = round(1000/fps) #set interval between frame

#Save Video
out = cv2.VideoWriter(videoFileName, fourcc, fps, (w,h))
if not (out.isOpened()):
	print("File isn't opend!!")
	cap.release()
	sys.exit()

#Load frame and Save it
while(True): #Check Video is Available
	ret, frame = cap.read() #read by frame (ret=TRUE/FALSE)s

	if ret:
		inversed = cv2.flip(frame, 1) #inversed frame

		out.write(inversed) #save video frame
		
		cv2.imshow('Original VIDEO', frame)
		cv2.imshow('Inversed VIDEO', inversed)

		if cv2.waitKey(delay) == 27: #wait 10ms until user input 'esc'
			break
	else:
		print("ret is false")
		break

cap.release() #release memory
out.release() #release memory
cv2.destroyAllWindows() #destroy All Window
  • 웹캠으로 입력받은 동영상을 저장하는 코드이다. 우선 두번째 예제와 같이 VideoCapture(0)을 사용하여 웹캠으로 동영상을 입력받을 수 있도록 로드한다
  • 동영상을 저장하는데 필요한 속성들을 세팅한다
    기본적으로 파일명, 가로, 세로, fps, fourcc를 지정해준다
  • 앞서 지정한 속성들과 VideoWriter 클래스를 사용하여 영상을 저장할 수 있도록 객체를 생성한다
  • 이후에는 앞서 진행한 과정과 동일하게 While문을 돌면서 프레임별로 접근한다
    이 때, OpenCV에 내장되어 있는 flip 메소드를 사용하여 좌우반전 시켜주도록 한다.
    파라미터를 1로 주면 좌우반전이고, 0으로 주면 상하반전이다
  • write()메소드를 통해 프레임을 저장한다. 이 때 영상만 저장되고, 소리를 저장되지 않음에 유의하도록 한다
  • 27번, 즉 ESC 키의 입력이 있을 때까지 웹캠을 계속해서 입력받으며, ESC의 입력이 있을 때는 while문을 빠져나가도록 한다
  • 모든 작업이 끝나면, release()를 통해 메모리를 해제하고 destoryAllWindows()를 통해 창을 종료한다

 


 

마지막 코드는 길어서 복잡해보이지만

하나하나 뜯어보면 실상 그렇게 어려운 코드는 아니다

 

침착하게 하나씩 볼 수 있도록 해보자 :)

 

 

728x90
반응형