OpenCV 동영상 처리

이주희·2022년 10월 5일
0

영상 처리

  • 프레임 추출
  • 각각의 프레임에 영상처리기법 적용

VideoCapture 클래스

함수

VideoCapture(string filename, int apiPreference = CAP_ANY)

VideoCapture객체 생성

bool VideoCapture::open(String& filename, int apiPreference = CAP_ANY)

  • C++에서는 별도 open함수를 호출해야 하지만 파이썬에서는 바로 사용 가능
    하지만 isOpened() 함수를 통해 제대로 파일 불러왔는지 확인 필요!

  • apiPreference : 사용할 비디오캡쳐 API 백엔드

  • 성공하면 true, 실패하면 false 리턴

VideoCapture::get(VideoCapture::~)

열려있는 파일로부터 여러 정보 받아오기 위해 사용

상수설명
CAP_PROP_POS_MSEC비디오 파일에서 현재 위치(msec)
CAP_PROP_POS_FRAMES현재 프레임 위치
CAP_PROP_POS_AVI_RATIO0~1 구간으로 표현한 상대적 프레임 위치
CAP_PROP_POS_WIDTH프레임 가로 크기
CAP_PROP_POS_HEIGHT프레임 세로 크기
CAP_PROP_POS_FPS초당 프레임 수
CAP_PROP_FRAME_COUNT비디오파일 전체 프레임 수
import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():
    print("Camera oepn failed!")
    exit()
    
print('Frame width: ', int(cap.get(cv.CAP_PROP_FRAME_WIDTH)))
print('Frame height:', int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))

bool VideoCapture::read(OutputArray image)

  • image : 다음 비디오 프레임, 더 가져올게 없다면 빈 행렬로 설정
  • 반환 : 더 가져올 수 없을 때 false 반환
while True:
    ret, frame = cap.read() # 읽음
    
    if not ret:
        break
        
inversed = ~frame

cv.imshow('frame', frame) # 읽은 영상 표출
cv.imshow('inversed', inversed)

if cv.waitKey(10)==27:
    break

cv.destroyAllWindows() # 모든 화면 닫기 

VideoCapture

  • 카메라 장치 열 경우 VIdeoCapture의 생성자에 문자열이 아니라 정수값 전달
    index = carema_id + domain_offset_id

  • 컴퓨터 한대에 카메라 하나면 camera_id =0

  • domain_offset_id : 카메라 장치를 사용하는 방식을 표현하는 정수
    보통은 자동 선택(CAP_ANY) 사용 -> 0 들어감

  • 반복문으로 카메라에서 프레임 받고 나면 각 프레임에 정지영상 처리기법 사용 가능

  • 고유의 코덱을 이용하여 압축된 형태로 저장

  • OpenCV는 MPEG-4, H.264 코덱 해석기능 제공

  • 동영상 파일일 경우 FPS(Frame Per Sec) 가지고 있음
    이를 이용하면 매 프레임 사이 시간간격 계산 가능
    delay = round(1000 / fps)
    이를 이용하면 waitKey 함수 인자로 사용가능

동영상 저장

VideoWriter 클래스 사숑

함수

VideoWriter::VideoWriter(string& filename, int fourcc, double fps, Size frameSize, bool isColor = true);

  • fourcc : 동영상 압축 코덱 표현
  • fps : 초당 프레임 수
  • frameSize : 영상 가로 세로 크기
  • isColor : true면 컬러, false면 그레이스케일

성공하면 true, 실패하면 false

0개의 댓글