카메라와 동영상 처리하기

yeoni·2023년 6월 28일
0

opencv

목록 보기
9/12

cv2.VideoCapture 클래스

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

첫 번째 방법

카메라열기

cv2.VideoCapture(index, apiPreference=None) -> retval
  • index: camera_id+ domain_offset_id
    시스템 기본 카메라를 기본 방법으로 열려면 index에 0을 전달
  • apiPreference: 선호하는 카메라 처리방법을 지정
  • retval:cv2.VideoCapture 객체
cv2.VideoCapture.open(index, apiPreference=None) -> retval
  • retval: 성공하면 True, 실패하면 False.

비디오 캡쳐가 준비되었는지 확인

cv2.VideoCapture.isOpened() -> retval
  • retval: 성공하면 True, 실패하면 False.

프레임 받아오기

cv2.VideoCapture.read(image=None) -> retval, image
  • retval: 성공하면 True, 실패하면 False.
  • image: 현재 프레임(numpy.ndarray)

예제

import sys
import cv2


# 기본 카메라 장치 열기
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print('camera open failed!')
    sys.exit()

# 카메라 프레임 처리
while True:
# 카메라로부터 프레임을 정상적으로 받아오면 ret에는 True, frame에는 해당프레임이 저장됨.
    ret, frame = cap.read()

    if not ret:
        break
	# 그레이 스케일로 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
	
    # 일정시간(e.g. 10ms) 기다린 후 다음 프레임 처리. 만약 ESC 키를 누르면 while 루프 종료.
    if cv2.waitKey(1) == 27:  # ESC
        break

cap.release() # 사용한 자원 해제
cv2.destroyAllWindows()

두 번째 방법

동영상, 정지영상시퀀스, 비디오스트림 열기

cv2.VideoCapture(filename, apiPreference=None) -> retval
  • filename: 비디오 파일 이름, 정지 영상 시퀀스, 비디오 스트림 URL 등
    (e.g) 'video.avi', 'img_%02d.jpg’, 'protocol://host:port/script?params|auth'
  • apiPreference: 선호하는 동영상 처리 방법을 지정
  • retval: cv2.VideoCapture 객체
cv2.VideoCapture.open(filename, apiPreference=None) -> retval
  • retval: 성공하면 True, 실패하면 False.

카메라, 비디오 장치 속성 값 참조

cv2.VideoCapture.get(propId) -> retval
  • propId: 속성 상수. (OpenCV문서참조)
  • retval: 성공하면 해당 속성값, 실패하면 0.
cv2.VideoCapture.set(propId, value) -> retval
  • propId: 속성 상수
  • value: 속성 값
  • retval: 성공하면 True, 실패하면 False.

예제

# 비디오 파일 열기
cap = cv2.VideoCapture('video1.mp4')

# 초당 프레임 수
fps = cap.get(cv2.CAP_PROP_FPS)

delay = round(1000 / fps)

# 비디오 매 프레임 처리
while True:
    ret, frame = cap.read()

    if not ret:
        break

    # 그레이 스케일 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)

    if cv2.waitKey(delay) == 27:
        break

cap.release()
cv2.destroyAllWindows()

Reference
1) 제로베이스 데이터스쿨 강의자료

profile
데이터 사이언스 / just do it

0개의 댓글