비디오 파일 재생하기와, Cam을 통한 영상을 저장하는 것을 진행해 보겠습니다.

비디오 처리

비디오 파일 불러오기

영상을 읽어오기 위해서는 cv2.VideoCapture 메소드를 사용합니다.

import cv2

video_file ='sample.avi'

cap = cv2.VideoCapture(video_file)
if cap.isOpened():
    while True:
        ret, img = cap.read()       # ret는 bool값으로 읽기가 성공일때 true를 반환
        if ret:
            cv2.imshow(video_file, img)
            if cv2.waitKey(25) != -1:   #25ms 단위로 키 입력을 대기함.
                break
        else:
            break
else:
    print('cant open video.')
cap.release()
cv2.destroyAllWindows()

위 소스에서 cv2.waitKey(25) 에서 25의 경우, 25ms을 의미하며,
25 = 1000 / 40 즉, 40fps 의 값을 의미합니다.
동영상 파일이 40fps가 많아서 해당 값을 사용합니다.
30fps인 경우 1000/30 = 33.333cv2.waitKey(33) 으로 사용하면 됩니다.

캠 영상 불러오기

연결된 장치의 캠에서 영상을 불러옵니다.

import cv2

cap = cv2.VideoCapture(0) #연결된 장치의 순서에 따라서 번호는 다를수 있음 0,1,2....
if cap.isOpened():
    while True:
        ret, img = cap.read()
        if ret:
            cv2.imshow('CAMERA Window', img)
            if cv2.waitKey(1) != -1:
                break
        else:
            print('프레임없음')
            break
else:
    print('카메라 열기 실패')
cap.release()
cv2.destroyAllWindows()

캠 영상 저장하기

카메라 오픈 후 개별 frame정보를 저장하는 방식으로 영상을 저장 합니다.

import cv2

cap = cv2.VideoCapture(0)

if cap.isOpened():
    file_path = 'path/sample.avi'
    fps = 25.40
    fourcc = cv2.VideoWriter_fourcc(*'DIVX') 
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    size = (int(width), int(height))
    out = cv2.VideoWriter(file_path, fourcc, fps, size)
    while True:
        ret, frame = cap.read()     #비디오에 대한 영역만 읽어옴, Sound 미포함.
        if ret:
            cv2.imshow('REC', frame)
            out.write(frame)
            if cv2.waitKey(int(1000 / fps)) != -1:
                break
        else:
            print('frame 정보 없음')
            break
    out.release()
else:
    print('카메라 열기 실패')
cap.release()
cv2.destroyAllWindows()

fourcc = cv2.VideoWriter_fourcc(*'DIVX') 부분은 저장 코덱을 선정하는 부분으로 다양한 코덱을 선정 할 수 있습니다.

  • (*‘DIVX’)DivxX mepg-4
  • (*‘FMP4’) FFMPEG
  • (*‘WMV2’) Window Media video8 코덱
  • (*‘X264’) H.264

cap 객체를 통해서 아래 추가가 값을 조회(get)/설정(set) 할수 있습니다.

  • cv2.CAP_PROP_FRAME_WIDTH : 프레임 폭
  • cv2.CAP_PROP_FRAME_HEIGHT : 프레임 높이
  • cv2.CAP_PROP_FPS : 초당 프레임 수
  • cv2/CAP_PROP_FOURCC : 동영상 파일의 코덱문자
  • cv2.CAP_PROP_POS_MSEC : 동영상 파일의 프레임 위치(ms)
  • cv2.CAP_PROP_POS_AVI_RATIO : 동영상 파일의 상대 위치(0:시작, 1:끝)
  • cv2.CAP_PROP_AUTOFOCUS : 카메라 자동 초점 조절
  • cv2.CAP_PROP_ZOOM : 카메라 줌
fps = cap.get(cv2.CAP_PROP_FPS)
delay = int(1000/fps) 
cv2.waitKey(delay)

비디오 정지 화면 저장

비디오 소스에서 정지 화면 저장하기

import matplotlib.pyplot as plt
import cv2
import numpy as np

def main():
    cap = cv2.VideoCapture(0)

    if cap.isOpened():
        ret, frame = cap.read()
        print(ret)
        print(frame)
    else:
        ret = False;

    img1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    plt.imshow(img1)
    plt.title('Color Image RGB')
    plt.xticks([])
    plt.yticks([])
    plt.show()

    cap.release()

if __name__ == "__main__":
    main()  

관련된 글 (python > lecture-opencv)