2016-12-09 4 views
1

Я делаю серию сегментации на основе цветного изображения на видеокадрах. Вот мой код:MATLAB: Как я могу избежать iamresize и VideoReader, если они занимают слишком много времени?

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 слишком долго выполняются. Есть ли какая-нибудь замена, которую я могу использовать?

ответ

0

imresize может быть самым медленным шагом в обработке. Но вот несколько идей для закрепления процесса.

imresize делать то, что называется интерполяцией. Это может быть медленный процесс, но скорость зависит от качества, которое вы хотите получить. Значение по умолчанию в matlab равно bicubic. Вы можете попробовать bilinear или nearest. например:

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

В моем Personnal экспериментов я также обнаружил, что 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.

Если вы работаете над цветным видеороликом, вам нужно собрать три цветовых слоя всего кадра и вернуть их с помощью правильной индексации.