본문 바로가기
Study/Python

[OpenCV] - 3 동영상 로드 및 저장

by YoungD 2023. 10. 23.
 
 
In [1]:
#from google.colab import drive
#drive.mount('/content/drive')
In [2]:
#%cd /content/drive/MyDrive/Colab Notebooks/인공지능강의/opencv

동영상을 읽고 출력하기

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

  • cap = cv2.VideoCapture(0)
    • 0번 카메라로부터 비디오 캡처
    • 0 대신에 파일명을 입력하면 동영상으로부터 캡처
      • cv2.VideoCapture(“images/video.mp4”)
    • IP가 부여된 웹캠인 경우 IP와 카메라 번호를 입력
      • cap = cv2.VideoCapture("rtsp:127.0.0.1/0")
  • cap.set(3, 480) : 비디오의 가로 크기 설정하기
  • cap.set(4, 320) : 비디오의 세로 크기 설정하기
  • w = cap.get(3) : 비디오의 가로 크기 가져오기
  • h = cap.get(4) : 비디오의 세로 크기 가져오기
  • ret, frame = cap.read()
    • 카메라로부터 비디오 파일을 읽고 프레임(frame) 이미지와 읽기성공여부(ret)를 반환 (True/False)
  • key = cv2.waitKey(33)
    • 0.03초동안 키 입력을 대기 (30프레임인 경우)
    • key 값은 아스키 코드로 반환
  • cap.release()
    • 비디오 객체를 종료하고 메모리를 해제
  • 아스키 코드 
In [3]:
import cv2

# 카메라로부터 영상 가져오기
cap = cv2.VideoCapture(0)

# 동영상으로부터 영상 가져오기
#cap = cv2.VideoCapture("./images/video.mp4")

# 영상에서 이미지 프레임을 읽어서 출력
# 영상이 열려 있는 동안
while cap.isOpened() :
    # 영상에서 프레임 이미지 읽기
    ret, frame = cap.read()
    
    # 좌우로 뒤집혀 나오는 것을 방지
    frame = cv2.flip(frame, 1)
    # 흑백이미지로 변환
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # 이미지를 읽지 못했다면 종료
    if not ret :
        print("종료")
        break
        
    # 출력
    cv2.imshow("video", frame)
    
    # 초당 30장 출력하고 키 입력 받음
    key = cv2.waitKey(33)
    
    # 만약 1 키를 눌렀다면 종료
    if key == 49 :
        print("종료")
        break
        
cap.release()
cv2.destroyAllWindows()
 

 

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

  • codec = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X') : 비디오 타입을 DIVX로 설정
  • out = cv2.VideoWriter('cctv01.avi', codec, fps, (w, h))
    • cctv01.avi 파일에 설정한 코덱, 프레임, 크기로 저장하도록 설정
  • out.write(frame) : 이미지 프레임을 파일에 쓰기
  • out.release() : 파일 객체 해제하기
In [4]:
import cv2

cap = cv2.VideoCapture("./images/video.mp4")

# 초당 프레임수는 원 영상 동일하게 설정
fps = int(cap.get(5))

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

# 영상 코덱 설정
codec = cv2.VideoWriter_fourcc(*"DIVX")

# 저장할 영상파일 설정
out = cv2.VideoWriter("./images/cctv01.avi", codec, fps, (w, h))

# 녹화여부
record = False

while cap.isOpened() :
    ret, frame = cap.read()
    
    if not ret :
        print("종료")
        break
        
    cv2.imshow("cctv", frame)    
    
    key = cv2.waitKey(33)
    
    if key == 49 :
        print("종료")
        break

    # 숫자 2를 누르면 녹화상태로 전환
    if key == 50 :
        print("녹화시작")
        record = True
    
    # 숫자 3을 누르면 녹화중지상태로 전환
    if key == 51 :
        print("녹화종료")
        record = False
        
    # 녹화
    if record :
        out.write(frame)
    
out.release()        
cap.release()
cv2.destroyAllWindows()
In [5]:
# colab은 설치되어 있음
!pip install moviepy
In [6]:
 

 

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

  • cv2.imwrite(“파일명.확장자”, 프레임이미지, 옵션)
    • params=[cv2.IMWRITE_PNG_COMPRESSION, 0]) : 압축 하지 않는 PNG, 세 번째 파라미터는 압축률로 0~9까지 설정 가능 (0은 압축 없음)
In [7]:
import cv2

cap = cv2.VideoCapture("./images/video.mp4")

# 파일이름
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 :
        print("종료")
        break
    
    # 이미지로 저장
    if key == 50 :
        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()

 

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

In [8]:
import cv2

img = cv2.imread("./images/pic_1.png")

h, w, c = img.shape

fps = 2.0

codec = cv2.VideoWriter_fourcc(*"DIVX")

out = cv2.VideoWriter("./images/pic_movie.avi", codec, fps, (w, h))

for i in range(1, 21) :
    img = cv2.imread(f"./images/pic_{i}.png")
    
    out.write(img)
    
out.release()    

 

pytube로 유튜브 영상 다운로드

  • 영상과 음성을 모두 다운로드
In [9]:
# 아나콘다 프롬프트 창에서 실행
!pip install --upgrade "git+https://github.com/nficano/pytube.git"
In [10]:
import os
import pytube
from pytube.cli import on_progress

# 유튜브 주소
url = "https://www.youtube.com/watch?v=XnPHJTEng_I"
yt = pytube.YouTube(url)

print(f"제목 : {yt.title}")
print(f"조회수 : {yt.views}")
print(f"평점 : {yt.rating}")

# 유튜브 영상은 다양한 해상도 별로 저장하고 있음
# order_by() : 해상도를 기준으로 영상을 정렬
# desc() : 내림차순정렬 (해상도가 높은 순으로 정렬)
# first() : 정렬한 영상들 중 첫번째 영상
yt.streams.filter(progressive=True, file_extension="mp4")\
                  .order_by("resolution").desc().first().download("./images/")

 

 
 
요약
 cv2.VideoCapture() : 비디오 캡처 (카메라, 동영상, 유튜브 등)
 ret, frame = cap.read() : 비디오로부터 프레임 이미지를 읽어서 반환
 cv2.VideoWriter_fourcc () : 녹화 파일을 설정하는 함수
 out.write() : 영상을 저장
 cv2.imwrite() : 이미지를 저장
○ 일반적인 동영상은 1초에 30장의 프레임이미지로 구성
○ pafy : 유투브 메타 데이터를 가져오는 라이브러리
○ yt-dlp : 유투브 영상을 다운로드하는 라이브러리 (음성 제외)
○ pytube : 유투브 영상을 다운로드하는 라이브러리 (음성 포함)

'Study > Python' 카테고리의 다른 글

[Python]OpenCV - 5 이미지 처리  (0) 2023.10.25
[Python] OpenCV - 4 Flask  (0) 2023.10.24
[Python]OpenCV - 2 이진화  (1) 2023.10.20
[Python] OpenCV - 1 이미지 로드 및 저장  (1) 2023.10.19
[Python] Train Data 실습  (0) 2023.10.18