OpenCV 영상처리 개요 및 실습

타키탸키·2021년 8월 19일
0

Vision

목록 보기
8/11
post-thumbnail

🎥 OpenCV 영상 처리 개요

OpenCV를 활용한 영상 처리

  • OpenCV의 VideoCapture 클래스
    • 동영상을 개별 Frame으로 하나씩 읽어들이는 기능 제공
  • VideoWriter
    • VideoCapture로 읽어들인 개별 Frame을 동영상 파일로 Write 수행
cap=cv2.VideoCapture(video_input_path)
...
vid_writer=cv2.VideoWriter(video_output_path, ...)

# 프레임 하나씩 읽고 쓰기
while True:
	# 다음 프레임 유무, 이미지 프레임
	hasFrame, img_frame=cap.read()
        if not hasFrame:
    	    print('더 이상 처리할 frame이 없습니다')
            break
        
        # 가공할 수 있는 새로운 파일 생성
        vid_writer.write(img_frame)

VideoCapture 개요

  • 생성 인자로 입력 video 파일 위치를 받아 생성
    • cap=cv2.VideoCapture(video_input_path)
  • 입력 video 파일의 다양한 속성 가져오기 가능
    • 영상 Frame 너비
      • cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    • 영상 Frame 높이
      • cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    • 영상 FPS(Frame Per Second)
      • cap.get(cv2.CAP_PROP_FPS)
  • read()는 마지막 Frame까지 차례로 Frame을 읽음
while True:
    hasFrame, img_frame=cap.read()
    if not hasFrame:
    	print('더 이상 처리할 frame이 없습니다')
        break

VideoWriter 개요

  • VideoWriter 객체
    • write할 동영상 파일 위치, Encoding 코덱 유형, write fps 수치, frame 크기를 생성자로 입력 받음
    • 이들 값에 따른 동영상 write 수행
    • write 시, 특정 포맷으로 동영상 Encoding 가능
      • DIVX, XVID, MJPG, X264, WMV1, WMV2
cap=cv2.VideoCapture(video_input_path)

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)

vid_writer=cv2.VideoWriter(video_output_path,vid_fps,vid_size)

🎥 OpenCV 영상 처리 실습

OpenCV 영상처리를 위한 준비

  • OpenCV
    • 간편하게 비디오 영상처리를 할 수 있는 API 제공
  • VideoCapture 객체
    • Video Streaming을 Frame 별로 Capture하여 처리할 수 있는 기능 제공
  • VideoWriter 객체
    • VideoCapture로 읽어들인 Frame을 동영상으로 Write하는 기능 제공
  • 영상 다운로드
!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

  • 비디오 input / output 경로 변수 저장
    • 동일한 파일 이름만 변경
    • linux에서 video output의 확장자는 반드시 avi로 설정 필요
import cv2

video_input_path = '/content/data/Night_Day_Chase.mp4'
# 
video_output_path = '/content/data/Night_Day_Chase_out.mp4'
  • 다양한 속성을 가져올 수 있는 cap 선언
cap = cv2.VideoCapture(video_input_path)
  • 비디오 Codec 설정
codec = cv2.VideoWriter_fourcc(*'XVID')
  • cap을 통해 video 크기와 fps 속성 가져오기
    • video 크기는 가로, 세로
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)
  • 경로와 속성을 인자로 넣어 video write
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size) 
  • frame 카운트
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)

OpenCV 영상처리

  • sample용 bounding box
    • Object Detection 실습은 나중에
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:
        print('더 이상 처리할 frame이 없습니다.')
        break
    index += 1
    print('frame :', index, '처리 완료')
    
    cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)
    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()


* 출처: 인프런 '딥러닝 컴퓨터 비전 완벽 가이드'
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글