OpenCV - 동영상 로드 및 저장

songmin jeon·2024년 1월 8일
0

1. 동영상을 읽고 출력하기

1.1. 카메라나 동영상으로부터 비디오 프레임 캡처하기


명령어


1.2. 실습(usb 카메라 구동해보기)

# 실습
import cv2

# 파일을 다룰 떄는 예외처리를 해주는 것이 오류로 인해 실행 중지되는 것을 방지
try: 
    # 카메라가 연결된 경우
    # cap = cv2.VideoCapture(0)
    # 동영상 파일인 경우
    cap = cv2.VideoCapture(0)
    # ip가 부여된 원격의 웹 카메라인 경우
    # cap = cv2.VideoCapture("rtsp:127.0.0.1/0")
    print('비디오 캡쳐 시작')
except :
    print('비디오 캡처 실패')
# 비디오가 캡처되었다면
while cap.isOpened():
    ret, frame = cap.read()
    
    # 프레임 이미지: 영상에 포함된 1장의 이미지
    # 이미지를 읽지 못하거나 전체 영상을 모두 플레이 한 경우
    if not ret: # ret이 False일 때 실행
        print('이미지 읽기 실패 또는 전체 영상 플레이 완료')
        break

    cv2.imshow("video", frame)
        
    key = cv2.waitKey(33)
    
    if key == 49: # 아스키 코드표 49 = 숫자1
        break
cap.release() # 비디오 객체 종료
cv2.destroyAllWindows() # 모든 창 닫기

1.3. 위젯을 이용하여 동영상 출력하기

import ipywidgets as widgets
from IPython.display import display
import cv2
import threading
# 전역변수 선언
global stop
stop = True

# 함수 선언
def on_button_clicked(event):
    # 함수 내부에서도 선언을 해줘야한다
    global stop
    stop = False

try :
    cap = cv2.VideoCapture('./images/video.mp4')
    print('비디오 캡처 시작')
    
except :
    print('비디오 캡처 실패')
    
w = cap.get(3)
h = cap.get(4)

# 영상 사이즈를 조절해서 위젯 이미지 객체를 생성해보자
image_widget = widgets.Image(format = 'jpeg', width = w / 2, height = h / 2)

# 버튼 위젯
button = widgets.Button(description = '중지', icon = 'stop')
button.on_click(on_button_clicked)

display(button, image_widget)

def funtion():
    while stop :
        ret, frame = cap.read()

        if not ret :
            print('프레임이미지 읽기 실패')
            break

        # frame 이미지를 jpeg 값으로 인코딩하고 배열 데이터를 byte 객체로 변환해서
        # 위젯 이미지 객체값으로 저장해주기
        encoed_state, encoded_image = cv2.imencode('.jpeg', frame)

        try :
            cv2.waitKey(33) # 초당 프레임 30간격으로 샘플링(재생속도 제어)
            image_widget.value = encoded_image.tobytes()
        except :
            break
        
    cap.release()
threading.Thread(target = funtion).start()


2. CCTV 만들기 - 동영상 녹화하기


명령어


2.1. 녹화영상

# 실습
import cv2

cap = cv2.VideoCapture('./images/drowsiness_all.mp4')
# 카메라로부터 영상 획득
#cap = cv2.VideoCapture(0)

# 녹화 설정
fps = 30.0 # 초당 프레임 이미지 수

# 영상의 크기
w=int(cap.get(3))
h=int(cap.get(4))

# codec 설정
codec = cv2.VideoWriter_fourcc(*'MP4V')

# 녹화파일 설정
out = cv2.VideoWriter('녹화중.mp4',codec,fps,(w,h))
# 녹화 여부 설정
record = False

# 비디오가 캡처 되었다면
while cap.isOpened():
    ret, frame = cap.read()
    if not ret :
        print('이미지 읽기 실패')
        break
    cv2.imshow('video',frame)
    key = cv2.waitKey(33)
    if key==49:
        print('녹화종료')
        break
    elif key ==50: # 숫자 2
        print('녹화시작')
        record = True
    
    if record:
        out.write(frame)
cap.release()
out.release()
cv2.destroyAllWindows()

2번 키를 누르면 카메라화면이 저장됨.


2.2. 동영상에서 한 프레임을 이미지 파일로 저장하기


명령어

cv2.imwrite(“파일명.확장자”, 프레임이미지, 옵션)

  • params=[cv2.IMWRITE_PNG_COMPRESSION, 0]) : 압축 하지 않는 PNG, 세 번째 파라미터는 압축률로 0~9까지 설정 가능 (0은 압축 없음)

# 실습
import cv2

# cap =cv2.VideoCapture('./images/video.mp4')

cap =cv2.VideoCapture(0)

# 파일명 구분하기 위한 카운터
co = 0

while cap.isOpened() :
    ret, frame = cap.read()
    
    if not ret :
        print('이미지 읽기 실패')
        break
    cv2.imshow('video', frame)   
    
    key = cv2.waitKey(33)
    
    if key == 49 :# 49 → 숫자 1
        break
        
    elif key == 50 : # 숫자2
        co += 1
        
        print(f"images/pic_{co}.png 파일 저장")
        cv2.imwrite(f"images/pic_{co}.png", frame, params = [cv2.IMWRITE_PNG_COMPRESSION, 0])
        
cap.release()
cv2.destroyAllWindows()

위에서 찍은 사진을 이어서 동영상으로 만듬


2.3. 저장한 이미지들을 동영상으로 만들기

# 실습
import cv2
img = cv2.imread('./images/pic_1.png')
h,w,_=img.shape
fps = 1.0
codec = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('sample.avi', codec,fps,(w,h))
for i in range(1, 20) :
    # 저장된 이미지 불어오기
    img = cv2.imread(f'./images/pic_{i}.png', cv2.IMREAD_COLOR)
    out.write(img)
# 동영상 저장이 끝나면 파일 해제
out.release()

3. 학습요약

○ cv2.VideoCapture() : 비디오 캡처 (카메라, 동영상, 유튜브 등)
○ ret, frame = cap.read() : 비디오로부터 프레임 이미지를 읽어서 반환
○ cv2.VideoWriter_fourcc () : 녹화 파일을 설정하는 함수
○ out.write() : 영상을 저장
○ cv2.imwrite() : 이미지를 저장
○ 일반적인 동영상은 1초에 30장의 프레임이미지로 구성

profile
제가 한 번 해보겠습니다.

0개의 댓글