이미지 시퀀스와 비디오 간 변환
이 예제에서는 VideoReader
와 VideoWriter
를 사용하여 비디오 파일과 이미지 파일 시퀀스 간에 변환하는 방법을 보여줍니다.
샘플 파일 shuttle.avi
에는 121개의 프레임이 포함되어 있습니다. VideoReader
와 imwrite
함수를 사용하여 프레임을 이미지 파일로 변환합니다. 그다음 VideoWriter
를 사용하여 이미지 파일을 AVI 파일로 변환합니다.
설정
이미지 시퀀스를 저장할 임시 작업 폴더를 만듭니다.
workingDir = tempname;
mkdir(workingDir)
mkdir(workingDir,"images")
VideoReader
객체 생성하기
샘플 파일에서 프레임을 읽어 들이는 데 사용할 VideoReader
객체를 만듭니다.
shuttleVideo = VideoReader("shuttle.avi");
이미지 시퀀스 생성하기
비디오를 따라 순환하면서 각 프레임을 img
라는 너비×높이×3 배열로 읽어 들입니다. N
.jpg
형식의 이름(여기서 N
= 3자리 숫자로 된 프레임 번호)을 사용하여 각 이미지를 JPEG 파일로 작성합니다.
i = 1; while hasFrame(shuttleVideo) img = readFrame(shuttleVideo); filename = sprintf("%03d",i)+".jpg"; fullname = fullfile(workingDir,"images",filename); imwrite(img,fullname) % Write to a JPEG file (001.jpg, 002.jpg, ..., 121.jpg) i = i+1; end
이미지 파일 이름 찾기
images
폴더에서 모든 JPEG 파일 이름을 찾습니다. 이미지 이름 세트를 셀형 배열로 변환합니다.
imageNames = dir(fullfile(workingDir,"images","*.jpg")); imageNames = {imageNames.name}';
이미지 시퀀스를 사용하여 새 비디오 생성하기
VideoWriter
객체를 생성합니다. 이 객체는 기본적으로 Motion-JPEG AVI 파일을 만듭니다.
outputVideo = VideoWriter(fullfile(workingDir,"shuttle_out.avi"));
outputVideo.FrameRate = shuttleVideo.FrameRate;
open(outputVideo)
이미지 시퀀스를 순환하면서 각 이미지를 불러온 다음 비디오에 작성합니다.
for i = 1:length(imageNames) img = imread(fullfile(workingDir,"images",imageNames{i})); writeVideo(outputVideo,img) end
비디오 파일을 완성합니다.
close(outputVideo)
완성된 비디오 보기
VideoReader
객체를 만듭니다.
shuttleAvi = VideoReader(fullfile(workingDir,"shuttle_out.avi"));
비디오 프레임에서 구조체형 배열을 만듭니다.
i = 1; while hasFrame(shuttleAvi) mov(i) = im2frame(readFrame(shuttleAvi)); i = i+1; end
비디오의 너비와 높이에 기반하여 Figure 크기를 정한 다음 비디오를 한 번 재생합니다.
vf = figure(Position=[0 0 shuttleAvi.Width shuttleAvi.Height]);
imshow(mov(1).cdata,Border="tight")
movie(vf,mov,1,shuttleAvi.FrameRate)
VideoReader
객체 지우기
VideoReader
객체를 지웁니다.
clear shuttleVideo shuttleAvi
출처
NASA가 공개한 우주 왕복선 비디오.