Computer Vision/opencv(python)

[09] 5) 카메라와 동영상 처리하기

jwjwvison 2021. 3. 15. 23:52
  • cv2.VideoCapture 클래스
    • OpenCV 에서는 카메라와 동영상으로부터 프레임 ( 을 받아오는 작업을 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(filename,apiPreference=None) ->retval

 

  • 비디오 캡쳐가 준비되었는지 확인
cv2.VideoCapture.isOpened() -> retval

 

  • 프레임 받아오기
cv2.VideoCapture.read(image=None) -> retval, image

 • retval : 성공하면 True, 실패하면 False.
 • image: 현재 프레임 (numpy.ndarray)

 

  • 카메라, 비디오 장치 속성 값 참조
cv2.VideoCapture.get(propId) -> retval

 

cv2.VideoCapture(propId,value) ->retval

 • propId : 속성 상수
 • value: 속성 값
 • retval: 성공하면 True, 실패하면 False.

 

  • 카메라 처리 예제
import sys
import cv2

'''
카메라 열기
cap = cv2.VideoCapture()
cap.open(0)
'''

cap=cv2.VideoCapture('video1.mp4')
# cap=cv2.VideoCapture(0)

if not cap.isOpened():
    print('camera open failed!')
    sys.exit()
w= cap.get(cv2.CAP_PROP_FRAME_WIDTH)
h=cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
print(w,h)

'''
카메라 장치 사이즈 세팅
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) #윤곽선 저장


    cv2.imshow('frame',frame)
    cv2.imshow('edge',edge)
    if cv2.waitKey(20)==27:
        break

cap.relase()
cv2.destroyAllWindows()

 

  •  cv2.VideoWriter 클래스

 • OpenCV 에서는 cv2.VideoWriter 클래스를 이용하여 일련의 프레임을 동영상 파일로 저장할 수 있음
 • 일련의 프레임은 모두 크기와 데이터 타입이 같아야 함

 

  • Fourcc (4-문자 코드, four character code)

  • 저장을 위한 동영상 파일 열기
cv2.VideoWriter(filename,fourcc,fps,frameSize,isColor=None) -> retval
  • fps: 초당 프레임수 ex)30
  • framsize: 프레임 크기 (width, height) 튜플
  • isColor: 컬러영상이면 True, 그렇지않으면 False
  • retval: cv2.VideoWriter 객체

 

  • 프레임 저장하기
cv2.VideoWriter.write(image) -> None

 • image: 저장할 프레임 (numpy.ndarray)

 

  • 웹카메라 입력을 동영상으로 저장하기
import sys
import cv2

cap=cv2.VideoCapture(0)

if not cap.isOpened():
    print('Camer 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)                  #한 프레임과 다음 프레임 사이의 시간(ms)

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) #videowritter 객체는 컬러영상을 저장하도록 만들었기 때문에
    out.write(edge_color)

    cv2.imshow('frame',frame)
    cv2.imshow('edge',edge)
    cv2.imshow('edge_color',edge_color)

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

cap.release()
out.release()
cv2.destroyAllWindows()