1

我正在对视频帧进行基于平均偏移颜色的图像分割。这是我的代码:

 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

我正在发送第一帧以实现均值偏移,然后对所有其他帧使用相同的结果均值,以根据欧几里德距离计算它们各自的集群(我的帧有微小的变化)。

问题:Profiler 告诉 iamresize 和 VideoReader 函数执行时间过长。有没有我可以使用的替代品?

4

1 回答 1

0

imresize可能是您处理过程中最慢的一步。但这里有几个想法来加快这个过程。

imresize做所谓的插值。这可能是一个缓慢的过程,但速度取决于您想要的输出质量。matlab 中的默认值是bicubic. 你可以试试bilinearnearest例如

[...] = 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');

然后,将您的处理应用于逐帧调整大小的电影。您还可以提供插值的类型nearsetlinearbicubic

如果您正在制作彩色电影,则需要将所有帧的 3 个颜色层堆叠在一起,并使用正确的索引将它们取回。

于 2016-12-14T17:42:26.543 回答