카메라와 동영상 처리하기
OpenCV에서는 카메라와 동영상으로부터 프레임(frame)을 받아오는 작업을 cv2.VideoCapture 클래스 하나로 처리한다.
✔ 카메라 열기
cv2.VideoCapture(index, apiPreference=None)
- index : camera_id + domain_offset_id
시스템 기본 카메라를 기본 방법으로 열려면 index에 0을 전달 - apiPreference : 선호하는 카메라 처리 방법을 지정
cv2.VideoCapture.open(index, apiPreference=None)
성공하면 True, 실패하면 False를 반환한다.
✔ 동영상, 정지 영상 시퀀스, 비디오 스트림 열기 - cv2.VideoCapture
cv2.VideoCapture(filename, apiPreference=None)
- filename : 비디오 파일 이름, 정지 영상 시퀀스, 비디오 스트림 URL 등
(e.g) 'video.avi', 'img_%02d.jpg', 'protocol://host:port/script?params|auth' - apiPreference : 선호하는 카메라 처리 방법을 지정
cv2.VideoCapture.open(filename, apiPreference=None)
성공하면 True, 실패하면 False를 반환한다.
✔ 비디오 캡쳐가 준비되었는지 확인
cv2.VideoCapture.isOpened()
성공하면 True, 실패하면 False를 반환한다.
✔ 프레임 받아오기 - cv2.VideoCapture.read
retval, image = cv2.VideoCapture.read(image=None)
- retval : 성공하면 True, 실패하면 False를 반환
- image : 현재 프레임 (numpy.ndarray) 반환
✔ 카메라, 비디오 장치 속성 값 - cv2.VideoCapture.get
cv2.VideoCapture.get(propId)
CAP_PROP_FRAME_WIDTH | 프레임 가로 크기 |
CAP_PROP_FRAME_HEIGHT | 프레임 세로 크기 |
CAP_PROP_FPS | 초당 프레임 수 |
CAP_PROP_FRAME_COUNT | 비디오 파일의 총 프레임 수 |
CAP_PROP_POS_MSEC | 밀리초 단위로 현재 위치 |
CAP_PROP_POS_FRAMES | 현재 프레임 번호 |
CAP_PROP_EXPOSURE | 노출 |
성공하면 해당 속성 값, 실패하면 0을 반환한다.
cv2.VideoCapture.set(propId, value)
- propId : 속성 상수
- value : 속성 값
성공하면 True, 실패하면 False를 반환한다.
💬 실습
import sys
import cv2
# 카메라 열기
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Camera open failed!")
sys.exit()
# 카메라 프레임 크기 출력
print('Frame width:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 카메라 프레임 처리
while True:
ret, frame = cap.read()
if not ret:
break
inversed = ~frame # 반전
cv2.imshow('frame', frame)
cv2.imshow('inversed', inversed)
if cv2.waitKey(10) == 27: # esc를 누르면 루프문 종료
break
cap.release()
cv2.destroyAllWindows()
OpenCV에서는 cv2.VideoWriter 클래스를 이용하여 일련의 프레임을 동영상 파일로 저장할 수 있다.
일련의 프레임은 모두 크기와 데이터 타입이 같아야 한다.
◾ Fourcc (4-문자 코드, four character code)
cv2.VideoWriter_fourcc(*'DIVX') | DIVX MPEG-4 코덱 |
cv2.VideoWriter_fourcc(*'XVID') | XVID MPEG-4 코덱 |
cv2.VideoWriter_fourcc(*'FMP4') | FFMPEG MPEG-4 코덱 |
cv2.VideoWriter_fourcc(*'X264') | H.264/AVC 코덱 |
cv2.VideoWriter_fourcc(*'MJPG') | Motion-JPEG 코덱 |
✔ 저장을 위한 동영상 파일 열기
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None)
- filename : 비디오 파일 이름 (e.g. 'video.mp4')
- fourcc : fourcc (e.g. cv2.VideoWriter_fourcc(*'DIVX'))
- fps : 초당 프레임 수 (e.g. 30)
- frameSize : 프레임 크기. (width, height) 튜플
- isColor : 컬러 영상이면 True, 그렇지않으면 False.
cv2.VideoWriter 객체를 반환한다.
cv2.VideoWriter.open(filename, fourcc, fps, frameSize, isColor=None)
성공하면 True, 실패하면 False를 반환한다.
✔ 비디오 파일이 준비되었는지 확인 - cv2.VideoWriter.isOpened
cv2.VideoWriter.isOpened()
성공하면 True, 실패하면 False를 반환한다.
✔ 프레임 저장하기 - cv2.VideoWriter.write
cv2.VideoWriter.write(image)
- image : 저장할 프레임 (numpy.ndarray)
💬 실습
import sys
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Camera open failed!")
sys.exit()
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') # *'DIVX' == 'D', 'I', 'V', 'X'
delay = round(1000 / fps)
out = cv2.VideoWriter('output.avi', fourcc, fps, (w, h)) # 비디오 저장
if not out.isOpened():
print('File open failed!')
cap.release()
sys.exit()
while True:
ret, frame = cap.read()
if not ret:
break
inversed = ~frame
out.write(inversed)
cv2.imshow('frame', frame)
cv2.imshow('inversed', inversed)
if cv2.waitKey(delay) == 27:
break
cap.release()
out.release()
cv2.destroyAllWindows()
'OpenCV' 카테고리의 다른 글
[OpenCV] 기초 6 : 트랙바 (0) | 2022.01.31 |
---|---|
[OpenCV] 기초 5 : 키보드 이벤트/ 마우스 이벤트 (0) | 2022.01.30 |
[OpenCV] 기초 3 : 마스크 / 그리기 함수 (0) | 2022.01.30 |
[OpenCV] 기초 2 (0) | 2022.01.30 |
[OpenCV] 기초 1 : 주요 함수 (0) | 2022.01.30 |