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
반응형
'Computer_Science > Computer Vision Guide' 카테고리의 다른 글
3-1. RCNN - region proposal 기반 OD (0) | 2021.09.24 |
---|---|
2-7. object detection network 개요 / FPS, resolution, 성능 상관관계 (0) | 2021.09.23 |
2-4~5. OpenCV 개요 (0) | 2021.09.21 |
2-3. MS-COCO DATASETS (0) | 2021.09.21 |
2-2. pascal dataset 살펴보기 (0) | 2021.09.21 |