Matlab:如何分配工作量?

时间:2013-08-28 14:49:23

标签: matlab video parallel-processing real-time

我目前正在尝试录制相机的镜头,并使用“image”命令在图形窗口中用matlab表示它。我面临的问题是图像的重绘速度很慢,这当然会影响我的整个脚本。这是一些快速伪代码来解释我的程序:

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

AcquireImageFromCamera()是来自相机API的mex。 现在,在不显示所获取的图像的情况下,脚本可以轻松地抓取来自摄像机的所有帧(它以有限的帧速率记录)。但是,只要我显示实时视频流的每个图像,它就会非常慢,因此帧会因为没有被捕获而丢失。

有没有人知道如何分割获取图像并显示它们以便使用CPU的多个核心的过程?并行计算是我脑海中浮现的第一件事,但并行工具箱的工作方式与我想要的完全不同......

编辑:我是学生,在我的教师的matlab版本中包括所有工具箱:)

3 个答案:

答案 0 :(得分: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()一次来设置绘图,然后直接更新像素。这应该比每帧调用image()快得多。您可以通过获取图像句柄并更改CData属性来完成此操作。

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

请注意,更新此类像素可能需要调用drawnow才能在屏幕上显示更改。

答案 1 :(得分:2)

Matlab在计算机视觉工具箱中有一个video player,它比使用image()更快。

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

答案 2 :(得分: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