2

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

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

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

有谁知道我如何拆分获取图像并显示它们的过程,以便使用 CPU 的多个内核?并行计算是我想到的第一件事,但并行工具箱的工作方式与我在这里想要的完全不同......

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

4

3 回答 3

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

请注意,像这样更新像素可能需要调用drawow以在屏幕上显示更改。

于 2013-08-28T15:20:36.433 回答
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
于 2013-08-29T02:44:18.717 回答
2

Matlab 在计算机视觉工具箱中有一个视频播放器,比使用 image() 更快。

player = vision.VideoPlayer
while(true)
  Frame = AcquireImageFromCamera();  % Mex, returns current frame
  step(player, Frame);
end
于 2013-08-28T15:18:32.563 回答