所以我刚开始使用MATLAB中的图像处理/计算机视觉。
所以我的第一个任务是将一系列图像(帧)转换为视频。所以我通过在线资料(更具体地说是MATLAB网站)来获得一种方法。
所以我实施的那个是http://www.mathworks.com/help/matlab/examples/convert-between-image-sequences-and-video.html,它解决了我的问题。
然而,当我播放时,视频在某些地方看起来很蠢。就像它会在中间带来一个不同的框架,并使整个视频跳跃一瞬间。它发生在视频中的几个地方。
任何人都知道为什么会这样?
由于
下面的PS是我使用的代码:myFolder = 'C:\Users\owner\Desktop\MATLAB GUI\Color\Color'; %Specify Directory
filePattern = fullfile(myFolder, '*.jpg') %identify jpg files
jpegFiles = dir(filePattern) %use dir to list jpg files
size = length(jpegFiles); % length of the size of the file
outputVideo = VideoWriter(fullfile(myFolder,'video1.avi'));
outputVideo.FrameRate = 30;
open(outputVideo);
for i = 1:length(jpegFiles) %load all the files in the directory
j = i; %%accumulating the number of jpegfiles into handles.j
baseFileName = jpegFiles(i).name;
fullFileName = fullfile(myFolder, baseFileName);
%fprintf(1, 'Now reading %s\n', fullFileName); %filename of image
imageArray = imread(fullFileName); %image being read
%imageArray = rgb2gray(imageArray);
imagecell{i} = imageArray; %storing the images in imagecells
writeVideo(outputVideo,imagecell{i});
end
close(outputVideo);
video1 = VideoReader(fullfile(myFolder,'video1.avi'));
mov(video1.NumberOfFrames) = struct('cdata',[],'colormap',[]);
for ii = 1:video1.NumberOfFrames
mov(ii) = im2frame(read(video1,ii));
end
set(gcf,'position', [150 150 video1.Width video1.Height])
set(gca,'units','pixels');
set(gca,'position',[0 0 video1.Width video1.Height])
image(mov(1).cdata,'Parent',gca);
axis off;
movie(mov,1,video1.FrameRate);
答案 0 :(得分:0)
鉴于可能有太多文件需要重命名(用零填充),这里有一个快速的功能可以为你完成:你只需要提供存储图像的目录/文件夹,填充(如果少于100个文件,然后填充可以是2;如果少于1000个文件,则填充可以是3;等等),以及常见模式。该代码假设每个文件中都有一个共同的模式(例如' frame'或'图像'),删除时只留下数字:
renameFiles(directory,padSize,fileNamePattern)
filePattern = fullfile(directory, '*.jpg') %identify jpg files
jpegFiles = dir(filePattern) %use dir to list jpg files
for k=1:size(jpegFiles)
% get the source file that will be moved/renamed
fileSrc = jpegFiles(k).name;
% get the parts of the file
[path,name,ext] = fileparts(fileSrc);
% where does the pattern fit in the name?
idx = strfind(name,fileNamePattern);
% remove the pattern from the name
if idx==0
% pattern does not exist in file so skip it
continue;
elseif idx==1
% pattern is at the beginning of name so remove it
frameNumberStr = name(length(fileNamePattern)+1:end);
else
% pattern is at the end of name so remove it
frameNumberStr = name(1:idx-1);
end
% get the number of digits
numDigits = length(frameNumberStr);
% create the new file name
paddedName = [fileNamePattern repmat('0',1,padSize-numDigits) frameNumberStr];
fprintf('%s\n',paddedName);
% only move if the destination is different
if strcmp(paddedName,name) ~= 1
% set the destination file
fileDest = fullfile(directory,[paddedName ext]);
% move the file
movefile(fileSrc, fileDest,'f');
end
end
end
一个例子 - 如果所有文件都具有' frame'的共同模式。并且文件少于1000个,然后将此功能作为
运行rename(pwd,3,'frame')
所有名为frame1.jpg
或frame99.jpg
的文件现在都被命名为frame001.jpg
和frame099.jpg
。
希望这有帮助!
答案 1 :(得分:0)
如果您有计算机视觉系统工具箱,则可以使用vision.VideoFileWriter对象。您只需将图像一次一张地输入其step()
方法,它们就会以视频帧的形式写入视频文件。请注意,图像必须大小相同且数据类型相同。