본문 바로가기

OpenCV

OpenCV를 이용한 동영상 처리 방법

개요

동영상은 이미지의 연속된 모음으로 구성되어 있습니다. 따라서 이미지 처리 기술을 활용해 동영상을 처리할 수 있습니다. 이번 포스트에서는 OpenCV를 이용한 동영상 처리 방법을 살펴보겠습니다.

동영상 읽기

OpenCV에서는 VideoCapture 클래스를 이용해 동영상을 읽을 수 있습니다. 다음과 같이 코드를 작성하면 됩니다.

 

import cv2

cap = cv2.VideoCapture('video.mp4')

while cap.isOpened():
    ret, frame = cap.read()

    if ret:
        cv2.imshow('frame', frame)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

VideoCapture 클래스는 인자로 동영상 파일의 경로를 받습니다. isOpened() 메소드는 동영상을 성공적으로 열었는지 확인합니다. read() 메소드는 현재 프레임과 성공 여부를 반환합니다.

waitKey() 함수는 ms 밀리초 동안 대기하다가 키보드 이벤트를 처리합니다. 만약 q 키를 누르면 반복문을 탈출합니다.

 

동영상 저장

OpenCV에서는 VideoWriter 클래스를 이용해 동영상을 저장할 수 있습니다. 다음과 같이 코드를 작성하면 됩니다.

import cv2

cap = cv2.VideoCapture('video.mp4')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 30.0, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()

    if ret:
        out.write(frame)
        cv2.imshow('frame', frame)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

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

VideoWriter 클래스는 인자로 저장할 파일명, 코덱, FPS, 프레임 크기를 받습니다. VideoWriter_fourcc() 함수는 코덱을 지정하는데 사용됩니다. XVID 코덱은 AVI 파일을 위한 MPEG-4 코덱입니다.

write() 메소드는 현재 프레임을 파일에 저장합니다.

 

동영상 프레임 수정

이제 비디오를 로드하고 재생할 수 있으므로 비디오의 프레임을 수정하는 방법을 살펴보십시오. 예를 들어 프레임에 필터를 적용하거나 프레임 크기를 조정할 수 있습니다. 다음은 프레임 크기를 조정하는 방법의 예입니다

 

import cv2

cap = cv2.VideoCapture('video.mp4')

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        # resize the frame
        resized_frame = cv2.resize(frame, (640, 480))

        cv2.imshow('frame', resized_frame)
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

 

결론

이 자습서에서는 OpenCV를 사용하여 비디오를 처리하는 방법을 배웠습니다. 비디오를 로드하고 재생하는 방법과 비디오 프레임을 수정하는 방법을 다뤘습니다. OpenCV는 광범위한 이미지 및 비디오 처리 기능을 제공하는 강력한 라이브러리이며, 자신의 프로젝트에서 OpenCV의 기능을 계속 탐색할 것을 권장합니다.