인공지능을 좋아하는 곧미남

Opencv 패키지를 이용한 Image Sequence를 Video로 변환! 본문

code_study/opencv

Opencv 패키지를 이용한 Image Sequence를 Video로 변환!

곧미남 2022. 1. 12. 12:56

안녕하세요 오늘은 Opencv 패키지를 이용해서 Image Sequence Data를 불러와 Video로 변환해보도록 하겠습니다!

 

저는 ConvLSTM을 학습해서 예측된 Sequence Data를 비디오로 만들어 보고 싶어 이렇게 코드를 구현해보았습니다.

 

우선, ConvLSTM 모델로 Moving MNIST 데이터를 이용한 학습 코드와 과정은 url: <https://github.com/sangheonEN/Vision_Transformer/tree/main/ConvLSTM> 참고해주시면 감사하겠습니다. 

 

 

오늘의 내용은 아래와 같습니다.

 

< INDEX >

 

1. Image Sequence Data를 불러와 Video로 변환 코드 설명.

 

2. 내용 고찰


1. Image Sequence Data를 불러와 Video로 변환 코드 설명.

우선 코드를 보면서 설명드리겠습니다.

import sys
import cv2
import glob
import os

image_path = os.path.dirname(os.path.abspath(__file__))
video_name = "test_1.wmv"

def image_load(image_path):

    img_array = []

    for filename in sorted(glob.glob(os.path.join(image_path, "image/*.png"))):
        img = cv2.imread(filename)
        img = cv2.resize(img, dsize=(270, 400), interpolation=cv2.INTER_LINEAR)
        h, w, channels = img.shape
        size = (h, w)
        img_array.append(img)

    return size, img_array


def video_generator(folder_path, file_name, size, fps, img_array):

    out = cv2.VideoWriter(filename=os.path.join(folder_path, file_name), fourcc=cv2.VideoWriter_fourcc('M','P','4','3'), fps=fps, frameSize=size)

    for img in img_array:
        out.write(img)

    out.release()


def video_play(file_name):

    cap = cv2.VideoCapture(file_name)

    while (cap.isOpened()):
        ret, frame = cap.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow("frame", gray)

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

    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    img_size, img_array = image_load(image_path)
    video_generator(folder_path= image_path, file_name=video_name, size=img_size, fps=15, img_array=img_array)
    video_play(file_name=video_name)

제가 구성한 코드는 3개의 메서드로 이루어져 있습니다.

 

1. def image load: Sequence Image Data를 불러와 img_array에 시퀀스 순서대로 저장합니다.

 

2. def video_generator: cv.2VideoWriter() 패키지를 사용하여 out이라는 변수에 video를 만들 가상의 비디오를 생성합니다. 그리고 위에서 저장한 img_array를 불러와 순서대로 out.write(img)를 선언하여 이미지를 영상으로 생성합니다.

 

3. def video_play: 저장된 video file을 불러와 실행시켜봅니다!


2. 내용 고찰

여기서, 중요한 점은 Sequence Image Data의 Resolution이 같아야하고(저는 resize로 동일한 이미지로 변환),

img = cv2.resize(img, dsize=(270, 400), interpolation=cv2.INTER_LINEAR)

해당 pc에 맞는 Codec의 정보와 .avi, .wmv, mp4 등의 영상 확장자를 확인한 후 아래와 같이 fourcc=cv2.VideoWriter_fourcc("", "", "", "") 변수를 지정해주어야 합니다.

cv2.VideoWriter(filename=os.path.join(folder_path, file_name), fourcc=cv2.VideoWriter_fourcc('M','P','4','3'), fps=fps, frameSize=size)

 

코덱에 맞는 코드는 해당 블로그에서 찾았습니다.

 

https://m.blog.naver.com/jws2218/221505827331

 

해당 코드를 잘 디버그하셔서 확인하시면 이해하기 쉽습니다.

 

감사합니다.

Comments