728x90
반응형

OpenCV VideoCapture클래스는 동영상을 개별 Frame으로 하나씩 read하는 기능을 제공

VideoWriter는 VideoCapture로 읽어들인 개별 Frame을 동영상 파일로 write 수행

 

Video Capture 개요

# Video Capture 객체는 생성인자로 입력 video 파일 위치를 받아 생성

cap = cv2.VideoCapture(video_input_path)

# Video Capture 객체는 입력 video 파일의 다양한 속성을 가져올수있음

cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 영상 Frame 너비
cap.get(cv2.CAP_PROP_FRAME_HEIGTH) # 영상 Frame 높이
cap.get(cv2.CAP_PROP_FPS) # 영상 FPS

# Video Capture 객체의 read()는 마지막 Frame까지 차례로 Frame 읽음

while True :
	hasFrame, img_frame = cap.read()
    if not hasFrame :
    	print('더 이상 처리할 frame이 없습니다')
        break

 

VideoWriter 개요

- VideoWriter객체는 write할 동영상 파일 위치, encoding 코덱 유형, write fps수치, frame 크기를 생성자로 입력받아 이들값에 따른 도영상 write 수행

VideoWriter는 write시 특정 포맷으로 동영상을 Encoding 할수있음(DIVX, XVID, MJPG, X264, WMV1, WMV2)

# file read
cap = cv2.VideoCapture(video_input_path)
# 해당 format으로 write
codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
vid_fps = cap.get(cv2.CAP_PROP_FPS)

# target으로 write
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

 

colab 에서 영상 다운로드

!mkdir ./data
!wget -O /content/data/Night_Day_Chase.mp4 https://github.com/chulminkw/DLCV/blob/master/data/video/Night_Day_Chase.mp4?raw=true

데이터 로드 및 확인

# 코랩 버전에서 위의 sample은 John wick이지만 실제 Video 처리는 강의와 동일하게 Night and Day로 수행. 

import cv2

video_input_path = '/content/data/Night_Day_Chase.mp4'
# linux에서 video output의 확장자는 반드시 avi 로 설정 필요. 
video_output_path = '/content/data/Night_Day_Chase_out.mp4'

cap = cv2.VideoCapture(video_input_path)
# Codec은 *'XVID'로 설정. 
codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #(200, 400)
vid_fps = cap.get(cv2.CAP_PROP_FPS )
    
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size) 

frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('총 Frame 갯수:', frame_cnt, 'FPS:', round(vid_fps), 'Frame 크기:', vid_size)
# 총 Frame 갯수: 1383 FPS: 28 Frame 크기: (1216, 516) # w h

frame 총 갯수에서 FPS(frame per second)를 나누면 시간을 구할수있음

1383 / 28 = 약 49초의 영상길이

import time

green_color=(0, 255, 0)
red_color=(0, 0, 255)

start = time.time()
index=0
while True:
    hasFrame, img_frame = cap.read()
    if not hasFrame: # false 방지
        print('더 이상 처리할 frame이 없습니다.')
        break
        
    index += 1
    print('frame :', index, '처리 완료')
    
    # 이 frame으로 detection code가 들어감
    
    # bounding box의 예시
    #              처리할 frame   위치               색깔    
    cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)

	# frame이 변할 때마다 적용 
 	caption = "frame:{}".format(index)
    cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1)
    
    vid_writer.write(img_frame)

print('write 완료 시간:', round(time.time()-start,4))
vid_writer.release()
cap.release()   

# frame : 1 처리 완료
# frame : 2 처리 완료
# frame : 3 처리 완료
# frame : 4 처리 완료
...
# frame : 1382 처리 완료
# frame : 1383 처리 완료
# 더 이상 처리할 frame이 없습니다.
# write 완료 시간: 15.5749

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts