我正在对视频帧进行基于均值偏移颜色的图像分割。下面是我的代码:
while hasFrame(v)
if k == 1
s(k).cdata = readFrame(v);
a = s(k).cdata;
I = imresize(a,[50,50]);
[means, Ims, Nms] = Ms(I,bw); %Mean Shift on first frame
Ims = im2uint8(Ims);
s(k).cdata = Ims;
else
s(k).cdata = readFrame(v);
a = s(k).cdata;
I = imresize(a,[50,50]);
[Ims,data2cluster]= MeanShiftCluster2(I,means); % simple segmentation based on norm using means of first frame
Ims = im2uint8(Ims);
Ims = imresize(Ims,[500,720]);
s(k).cdata = Ims;
end
k=k+1;
end
我发送第一个帧用于均值漂移实现,然后对所有其他帧使用相同的结果方法,以基于欧几里德距离计算它们各自的聚类(我的帧有微小的变化)。
问题:分析器显示iamresize和VideoReader函数执行时间太长。有没有我可以用的替代品?
发布于 2016-12-15 01:42:27
imresize
可能是处理过程中最慢的一步。但这里有几个想法来加速这一过程。
imresize
做的就是所谓的插值。这可能是一个缓慢的过程,但速度取决于您希望输出的质量。matlab中的缺省值是bicubic
。您可以尝试使用bilinear
或nearest
。例如:
[...] = imresize(...,'nearest');
在我的个人实验中,我还发现imresize作为等价的函数有一些开销。通过对所有视频帧只调用一次该函数,您可能会“快得多”。您需要有足够的内存才能做到这一点。假设你的所有帧都在一个3d矩阵dataMovie
中。当构建这个矩阵时,预分配(通过获取帧的数量)将有助于获得一些速度!
k = 0.5; % scaling parameter
tform = affine2d([k 0 0;0 k 0;0 0 1]);
dataTform = imwarp(dataMovie,tform,'nearest');
然后,将您的处理应用于逐帧调整大小的影片。您还可以提供插值类型nearset
、linear
或bicubic
。
如果你正在处理一部彩色电影,你需要将所有帧的3个颜色层堆叠在一起,并使用适当的索引将它们取回。
https://stackoverflow.com/questions/41055288
复制相似问题