Opencv 실시간 영상처리 - opencv silsigan yeongsangcheoli

꾸준하고 즐겁게

카테고리 없음

OpenCV 라이브러리로 실시간으로 전달받은 영상 처리하고, 저장하는 코드

wj9183 2021. 5. 20. 13:03

Opencv 실시간 영상처리 - opencv silsigan yeongsangcheoli
블랙박스는 콩글리시다. ㄴㅇㄱ!!
# 캠이나 카메라를 통해 실시간으로 전달받은 영상을 처리하는 코드이다.

import cv2
import numpy as np

# 캠으로부터 데이터 가져온다.
cap = cv2.VideoCapture(0)
# 저장될 영상은 mp4형식이다.
# 캠이 여러대인 경우 인자로 0, 1, 2, 3...을 넣어주면 된다.


# 캠으로부터 정보를 읽어들일 수 없는 경우 에러 메세지를 반환한다.
if cap.isOpened() == False:
    print("Unable to read camera")

# 캠으로부터 정보를 읽어들일 수 있으면,
else:

    # 프레임의 정보 가져와 변수에 저장한다. 
    frame_width = int(cap.get(3))
    frame_height = int(cap.get(4))


    #캠으로 들어온 비디오를 따로 저장한다.
    out = cv2.VideoWriter('data/videos/output.avi',
                        cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'),
                        10,
                        (frame_width, frame_height) )
                        
                        
    # 동영상은 사진을 여러장 이어서 보여주는 개념이다.
    # 1초에 몇 장의 이미지가 들어가는지, fps(frame per second) 단위를 쓴다.
    # 캠으로부터 이미지 한 장만을 받아올 게 아니므로, 반복문을 사용한다.
    while True:
        ret, frame = cap.read()
        if ret == True:
            out.write(frame)
            cv2.imshow('frame', frame)
			#esc를 입력하면, 이미지를 받아오길 멈추게 한다.
            if cv2.waitKey(1) & 0xFF == 27:
                break
        else:
            break
            
            
    # sql 커서와 커넥션을 다 사용하고 나면 연결을 닫아주듯이, 비디오캡쳐도 닫아준다.
    cap.release()
    # 파일도 더 이상 작성하지 않도록 한다.
    out.release()
    
 	#화면에 띄운 창을 닫아준다.
    cv2.destroyAllWindows()

 

캠이나 카메라가 있어야 테스트해볼 수 있다.
만약 카메라 가져오는 거 실패하면 재부팅하고 다시해보는 게 좋다.
눈으로 확인할 수 있는 결과물이 있으니 즐겁다.

🎥 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()

Opencv 실시간 영상처리 - opencv silsigan yeongsangcheoli

Opencv 실시간 영상처리 - opencv silsigan yeongsangcheoli

* 출처: 인프런 '딥러닝 컴퓨터 비전 완벽 가이드'