AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • 백준
  • LEVEL2
  • 연습문제
  • 파이썬
  • 이코테
  • Python
  • level1
  • 알고리즘
  • 프로그래머스
  • OpenCV

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

[OpenCV] 기초 4 : 카메라와 동영상 처리
OpenCV

[OpenCV] 기초 4 : 카메라와 동영상 처리

2022. 1. 30. 22:02

카메라와 동영상 처리하기

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)
  • propId : 속성 상수 (OpenCV 문서 참조)
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)

 

Video Codecs by FOURCC - fourcc.org

 

www.fourcc.org

 

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
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바