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 |