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()
✅ 동영상 파일 열기
📄사용한 동영상 파일
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
'Python > Computer Vision' 카테고리의 다른 글
[파이썬, Python] OpenCV - 영상의 화소 처리 (0) | 2023.08.24 |
---|---|
[파이썬, Python] OpenCV - 키보드, 마우스 이벤트 (0) | 2023.08.24 |
[파이썬, Python] OpenCV - 영상에 도형 그리기! (0) | 2023.08.04 |
[파이썬, Python] OpenCV - 영상(Image)과 영상의 입출력, 복사하기 (0) | 2023.07.24 |
[파이썬, Python] 컴퓨터 비전과 OpenCV 라이브러리 (0) | 2023.07.24 |