[ Python ] 이미지들을 동영상으로 만들기 (images -> mp4)

2020. 1. 11. 15:55분석 Python/Visualization

728x90

파이썬 이미지를 동영상 파일로 바꾸는 방법은 여러 개가 있다.

## png -> mp4
os.system(f'ffmpeg -r 30 -i ims/2/a/2a.*.png'
              f' -crf 30 ims/2/a/2a.mp4')

## png -> gif
os.system('convert -delay 15 -loop 0 ims/2/a/2a.*.png ims/2/a/2a.gif')

저런 것은 linux를 이용하여서 하는 작업인데, 이번에는 파이썬에서 opencv를 이용해서 이미지 파일들을 좀 더 고화질로 영상을 만들어보는 코드가 있어서 변형해서 공유한다.

import re
path = "ims/2/a"
paths = [os.path.join(path , i ) for i in os.listdir(path) if re.search(".png$", i )]
## 정렬 작업
store1 = []
store2 = []
for i in paths :
    if len(i) == 19 :
        store2.append(i)
    else :
        store1.append(i)

paths = list(np.sort(store1)) + list(np.sort(store2))
#len('ims/2/a/2a.2710.png')

학습한 것을 동영상으로 만들려다보니 순서가 꼬여서 다음과 같은 방법으로 정렬을 하였다.
현재 이미지는 4999개가 있다.

이제 해당 이미지를 mp4로 만들어 보자.
fps란  1초당 보여주는 화면의 장수를 뜻한다고 하니, 여기서는 1초에 50장씩 보여주도록 설정했다.
4999장이라 너무 많은 것은 같아서 2999개만 동영상으로 만들어 봤다.

pathIn= './ims/2/'
pathOut = './ims/2/gan.mp4'
fps = 30
import cv2
frame_array = []
for idx , path in enumerate(paths) : 
    if (idx % 2 == 0) | (idx % 5 == 0) :
        continue
    img = cv2.imread(path)
    height, width, layers = img.shape
    size = (width,height)
    frame_array.append(img)
out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)
for i in range(len(frame_array)):
    # writing to a image array
    out.write(frame_array[i])
out.release()

728x90