【问题标题】:Matlab: How to distribute workload?Matlab:如何分配工作量?
【发布时间】:2013-08-28 14:49:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: matlab video parallel-processing real-time


    【解决方案1】:

    运行两个线程或工作线程会有点棘手。取而代之的是,您可以不那么频繁地更新屏幕吗?像这样的:

    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。您还可以使用pause 函数减少屏幕更新频率。
    • 这确实可以捕获更多帧,但我确实需要以高帧速率显示它们。
    • @am304 我不认为pause 在这里会有所帮助。它也会停止数据采集。
    • @potAito 我的第二个更新像素的想法可能会让你实现全帧率。你只需要尝试一下。
    • @shoelzer 你确定吗?数据获取好像是通过AcquireImageFromCamera函数调用完成的,在你需要暂停执行的时候完成。
    【解决方案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
    

    【讨论】:

    • 嗯嗯......你从哪里得到这个想法的? :)
    • 嗯,显然是因为阅读了你的好答案,足以得到正确的解决方案,但还不足以承认它。
    • 没问题。我只是在开玩笑。很高兴您发现了我的错误并以正确的方式设置 CData。
    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢,看起来很有希望!我会尽快安装工具箱。您是否有机会知道是否还有其他支持逐步播放的播放功能,也许是 implay() ?
    • 您可以使用 OpenCV 库来实现 this 要在 Matlab 中使用 openCV,您需要 this。这种方法更复杂,但可以证明更有效。我没试过! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2011-03-26
    • 2013-01-07
    • 1970-01-01
    • 2018-11-16
    • 2013-02-21
    • 2020-03-31
    相关资源
    最近更新 更多