본문 바로가기
Python/Computer Vision

[파이썬, Python] OpenCV - 동영상 처리하기!

by coding-choonsik 2023. 8. 23.
728x90
반응형
SMALL

1.  cv2.VideoCapture 클래스

  • 카메라와 동영상으로부터 프레임(frame)을 받아오는 작업을 처리함

 

2. 카메라 영상 입력

 
2-1. cv2.VideoCapture(index)

  •  index: 시스템의 기본 카메라를 open하려면 0 또는 카메라 고유의 값(웹캠)


2-2. cv2.VideoCapture.isOpened()

  • True: 동영상 불러오기 성공, False: 실패
  • cv2.CAP_PROP_FRAME_WIDTH: 카메라로 읽어들인 동영상의 가로 사이즈
  • cv2.CAP_PROP_FRAME_HEIGHT: 카메라로 읽어들인 동영상의 세로 사이즈

 

2-3. cv2.VideoCapture.read()

  • ret: 영상이 정상적으로 리턴되었는지 여부(True, False)
  • frame: 영상 자체를 반환(그레이스케일 영상 또는 컬러영상, 2차원 배열)

 

 

3. 동영상 입출력

 

3-1. 동영상 입력

  •  cv2.VideoCapture(파일명)

 

3-2. 동영상 출력

  • FourCC(Four Character Code): 4바이트로 된 문자열이며, 데이터 형식을 구분하는 고유 글자
  • 주로 AVI 파일의 영상 코덱을 구분할 때 사용
  •  Divx, Xvid, H264 ...
    • cv2.VideoWritter_fourcc(*'DIVX')  # DVIX로 저장
    • cv2.VideoWritter_fourcc(*'XVID')  # XVID로 저장
    • cv2.VideoWritter_fourcc(*'MP4V')  # mp4로 저장

 

 3-3.  동영상 파일 저장

  • cv2.VideoWriter(파일명, FourCC객체, fps, 프레임사이즈, 컬러영상여부)
  • 프레임사이즈: (w, h)의 튜플
  • 컬러영상여부: True-컬러, False-그레이스케일

✅ 웹캠 열기

import sys
import cv2

cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print('카메라를 열 수 없습니다')
    sys.exit()  # 프로그램 종료

print('카메라 연결 성공!')
print('가로 사이즈: ', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('세로 사이즈: ', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

while True:
    ret, frame = cap.read()  # 영상을 불러왔다면 ret: True, frame에 영상정보가 담김
    if not ret:
        break
    cv2.imshow('frame', frame)
    if cv2.waitKey(10) == 27:  # 0.01초(밀리세컨드 단위이기때문)동안 기다리면서 27번키(esc)가 입력되면
        break

cap.release()

>>>
카메라 연결 성공!
가로 사이즈:  640
세로 사이즈:  480

 

✅ 웹캠 동영상 저장하기

import cv2

cap = cv2.VideoCapture(0)

W = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
H = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('output.avi', fourcc, fps, (W, H))  # 기본값은 컬러영상

while True:
    ret, frame = cap.read()
    if not ret:
        break
    out.write(frame)  # 프레임을 'output.avi'에 계속 저장
    cv2.imshow('frame', frame)

    if cv2.waitKey(10) == 27:
        break

cap.release()

✅ 동영상 파일 열기

 

📄사용한 동영상 파일

cat.mp4
1.03MB
cat2.mp4
0.48MB

import sys
import cv2

cap = cv2.VideoCapture('cat.mp4')

if not cap.isOpened():
    print('동영상을 읽어올 수 없습니다')
    sys.exit()  # 프로그램 종료

print('동영상 열기 성공!')
print('가로 사이즈: ', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('세로 사이즈: ', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('프레임 수:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))  # 전체 프레임 수
# 1초당 프레임수
fps = cap.get(cv2.CAP_PROP_FPS)
print('fps 수:', fps)  # 1초에 약 30개의 영상이 재생

while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('frame', frame)
    if cv2.waitKey(10) == 27:
        break

cap.release()  # 메모리에서 날림, 메모리를 아껴쓸 수 있음


>>> 
동영상 열기 성공!
가로 사이즈:  640
세로 사이즈:  360
프레임 수: 411
fps 수: 25.0

 

✅ 동영상 파일 저장

import cv2
import numpy as np

cap1 = cv2.VideoCapture('cat.mp4')
cap2 = cv2.VideoCapture('cat2.mp4')

frame_cnt1 = round(cap1.get(cv2.CAP_PROP_FRAME_COUNT))
frame_cnt2 = round(cap2.get(cv2.CAP_PROP_FRAME_COUNT))
print('frame_cnt1: ', frame_cnt1)
print('frame_cnt2: ', frame_cnt2)

fps1 = cap1.get(cv2.CAP_PROP_FPS)
fps2 = cap2.get(cv2.CAP_PROP_FPS)
print('fps1: ', fps1)
print('fps2: ', fps2)

w1 = round(int(cap1.get(cv2.CAP_PROP_FRAME_WIDTH)))
h1 = round(int(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT)))
w2 = round(int(cap2.get(cv2.CAP_PROP_FRAME_WIDTH)))
h2 = round(int(cap2.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('w1: ', w1)
print('h1: ', h1)
print('w2: ', w2)
print('h2: ', h2)

fourcc = cv2.VideoWriter_fourcc(*'DIVX')

output = cv2.VideoWriter('mix.avi', fourcc, fps1, (w1, h1))

for i in range(frame_cnt1):
    ret1, frame1 = cap1.read()
    cv2.imshow('mix', frame1)
    output.write(frame1)
    if cv2.waitKey(10) == 27:
        break
for i in range(frame_cnt2):
    ret2, frame2 = cap2.read()
    cv2.imshow('mix', frame2)
    output.write(frame2)
    if cv2.waitKey(10) == 27:
        break


cap1.release()
cap2.release()
output.release()

 

 

728x90
반응형
LIST