2013-08-28 2 views
1

В настоящее время я пытаюсь записать кадры из камеры и представить ее с помощью Matlab в графическом окне с помощью команды «изображение». Проблема, с которой я сталкиваюсь, это медленное перерисовка изображения, и это, конечно, влияет на весь мой скрипт. Вот некоторые быстрый псевдо-код, чтобы объяснить свою программу:Matlab: Как распределить рабочую нагрузку?

figure 
    while(true) 
     Frame = AcquireImageFromCamera(); % Mex, returns current frame 
     image(I); 
    end 

AcquireImageFromCamera() является MEX, исходящее от API для камеры. Теперь без отображения полученного изображения сценарий легко захватывает все кадры, поступающие с камеры (он записывает с ограниченной частотой кадров). Но как только я показываю каждое изображение для потокового видео в реальном времени, он сильно замедляется, и поэтому кадры теряются, поскольку они не захватываются.

Есть ли у кого-нибудь идеи, как я мог бы разделить процесс получения изображений и их отображения, чтобы использовать несколько ядер центрального процессора? Параллельные вычисления - это первое, что приходит мне в голову, но параллельная панель инструментов работает совершенно по-другому, что я хочу здесь ...

Редактировать: Я студент, и в моей версии MATLAB все панели инструментов включены :)

ответ

2

Я не уверен, насколько точным является ваш псевдокод, но создание объекта изображения требует довольно больших затрат. Гораздо быстрее создать его один раз, а затем просто установить данные изображения.

figure 
himg = image(I) 
while(true) 
    Frame = AcquireImageFromCamera(); % Mex, returns current frame 
    set(himg,'cdata',Frame); 
    drawnow; %Also make sure the screen is actually updated. 
end 
+0

Хммммм ... Откуда у вас эта идея? :) – shoelzer

+0

Ну, видимо, это было из чтения вашего хорошего ответа, чтобы получить правильное решение, но недостаточно, чтобы признать его. – RyanD

+0

Не проблема. Я просто дразня. Рад, что вы поймали мою ошибку и правильно установили CData. – shoelzer

2

Matlab имеет video player в панели инструментов компьютерного зрения, которая будет быстрее, чем использование изображения().

player = vision.VideoPlayer 
while(true) 
    Frame = AcquireImageFromCamera(); % Mex, returns current frame 
    step(player, Frame); 
end 
+0

Большое спасибо, выглядит многообещающе! Я установлю панель инструментов как можно скорее. Знаете ли вы, если есть другие функции воспроизведения, поддерживающие пошаговое воспроизведение, возможно, implay()? – Cat

+0

Вы можете использовать библиотеку OpenCV для достижения [this] (http://stackoverflow.com/questions/6984447/how-to-play-a-video-file-from-my-disk-using-opencv) Чтобы использовать openCV в Matlab вам понадобится [это] (http://www.cs.stonybrook.edu/~kyamagu/mexopencv/). Этот подход более сложный, но может оказаться более эффективным. Я не пробовал! :) – Prashanth

4

Запуск двух потоков или рабочих будет немного сложнее. Вместо этого вы можете просто обновлять экран реже? Что-то вроде этого:

figure 
count = 0; 
while(true) 
    Frame = AcquireImageFromCamera(); % Mex, returns current frame 
    count = count + 1; 
    if count == 5 
     count = 0; 
     image(I); 
    end 
end 

Другое дело, чтобы попытаться это назвать изображение() только один раз, чтобы создать сюжет, а затем обновить пиксели непосредственно. Это должно быть намного быстрее, чем вызов image() каждого кадра. Вы делаете это, получая дескриптор изображения и изменяя свойство CData.

h = image(I); % first frame only 
set(h, 'CData', newPixels); % other frames update pixels like this 

Обратите внимание, что обновление пикселей, как это может затем потребовать вызова drawnow, чтобы показать изменения на экране.

+0

+1. Вы также можете использовать функцию 'pause' для обновления экрана реже. – am304

+0

Это действительно позволило бы захватить больше кадров, но мне действительно нужно также отображать их с высокой частотой кадров. – Cat

+0

@ am304 Я не думаю, что «пауза» поможет здесь. Это также остановило бы сбор данных. – shoelzer

Смежные вопросы