728x90
반응형
1. cv2.VideoCapture 클래스
- OpenCV에서는 카메라와 동영상으로부터 프레임(frame)을 받아오는 작업을 cv2.VideoCapture 클래스 하나로 처리함

- 전체 코드
# 카메라 열기
cap = cv2.VideoCapture('video1.mp4') # 동영상 열기
# 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))) # 640
print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) # 480
# 카메라 프레임 크기 변경
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# 카메라 프레임 처리
while True:
ret, frame = cap.read() # 프레임 받아오기
if not ret:
break
edge = cv2.Canny(frame, 50,150) # 윤곽선 추출
inversed = ~frame # 반전
cv2.imshow('frame', frame) # 기본
cv2.imshow('edge', inversed) # 윤곽선
cv2.imshow('inversed', inversed) # 반전
if cv2.waitKey(10) == 27: # ESC
break
cap.release() # 사용한 자원 해제
cv2.destroyAllWindows()

2. cv2.VideoWriter 클래스
- OpenCV에서는 cv2.VideoWriter 클래스를 이용하여 일련의 프레임을 동영상 파일로 저장할 수 있음
- 일련의 프레임은 모두 크기와 데이터 타입이 같아야 함
저장을 위한 동영상 파일 열기
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None) -> retval
- filename: 비디오 파일 이름 (e.g. 'video.mp4')
- fourcc: fourcc (e.g. cv2.VideoWriter_fourcc(*'DIVX'))
- fps: 초당 프레임 수 (e.g. 30)
- frameSize: 프레임 크기. (width, height) 튜플.
- isColor: 컬러 영상이면 True, 그렇지않으면 False.
- retval: cv2.VideoWriter 객체
cv2.VideoWriter.open(filename, fourcc, fps, frameSize, isColor=None) -> retval
- retval: 성공하면 True, 실패하면 False.
비디오 파일이 준비되었는지 확인
cv2.VideoWriter.isOpened() -> retval
- retval: 성공하면 True, 실패하면 False.
프레임 저장하기
cv2.VideoWriter.write(image) -> None
- image: 저장할 프레임 (numpy.ndarray)
- 전체 코드
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
edge = cv2.Canny(frame, 50,150)
edge_color = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
out.write(inversed)
out.write(edge_color)
cv2.imshow('frame', frame) # 기본
cv2.imshow('inversed', inversed) # 반전
cv2.imshow('edge_color', edge_color) # 윤곽선
if cv2.waitKey(delay) == 27: # ESC
break
cap.release() # 카메라 해제
out.release() # 동영상 파일 해제
cv2.destroyAllWindows()728x90
반응형
'OpenCV' 카테고리의 다른 글
| OpenCV 연산 시간 측정(cv2.TickMeter) (0) | 2024.03.16 |
|---|---|
| OpenCV 키보드, 마우스 이벤트 처리 (0) | 2024.03.16 |
| OpenCV 그리기 함수(직선, 사각형, 원, 다각형, 문자열) (2) | 2024.03.15 |
| OpenCV 마스크 연산& ROI (0) | 2024.03.15 |
| OpenCV 이미지(영상)의 생성, 복사, 부분 영상 추출 (1) | 2024.03.15 |