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

平均シフトの実装のために最初のフレームを送信し、他のすべてのフレームに同じ結果の平均を使用して、ユークリッド距離に基づいてそれぞれのクラスターを計算しています (私のフレームには小さな変更があります)。

問題: プロファイラーは、iamresize および VideoReader 関数の実行に時間がかかりすぎると通知します。代用できるものはありますか?

4

1 に答える 1

0

imresize処理の最も遅いステップである可能性があります。しかし、プロセスを固定するためのいくつかのアイデアがあります。

imresizeいわゆる補間を行います。これは遅いプロセスになる可能性がありますが、速度は出力に必要な品質によって異なります。matlab のデフォルトは ですbicubicbilinearまたはを試すことができますnearest:

[...] = imresize(...,'nearest');

私の個人的な実験では、同等の関数としての imresize にはいくらかのオーバーヘッドがあることもわかりました。すべてのビデオ フレームに対して関数を 1 回だけ呼び出すことで、おそらく "はるかに" 高速になる可能性があります。これを行うには、十分なメモリが必要です。すべてのフレームが 3d マトリックスにあるとしますdataMovie。このマトリックスを構築するとき、(フレーム数を取得することによる) 事前割り当ては、速度を上げるのに役立ちます!

k = 0.5; % scaling parameter
tform = affine2d([k 0 0;0 k 0;0 0 1]);
dataTform = imwarp(dataMovie,tform,'nearest');

次に、処理をフレームごとにムービーのサイズ変更に適用します。補間のタイプnearsetlinearまたはを指定することもできbicubicます。

カラー ムービーで作業している場合は、すべてのフレームの 3 つのカラー レイヤーを一緒にスタックし、適切なインデックスを使用して元に戻す必要があります。

于 2016-12-14T17:42:26.543 に答える