【问题标题】:Optimizing image acquisition with Matlab parallel computing toolbox tools使用 Matlab 并行计算工具箱工具优化图像采集
【发布时间】:2012-08-10 22:59:39
【问题描述】:

使用单个 matlab 工作者,我可以轻松地使用我的相机(使用 matlab imaq 工具箱)实现最大每秒帧数 (fps)。这个简单的代码做到了:

matlabpool(1)
start(vid)
pause(1); % give matlab time to initialize the camera
for j=1:frames
     data = getsnapshot(vid);
end

但是,一旦我尝试即时进行一些图像处理,有效率就会下降 50%。由于我在 matlabpool 中还有 5 个工作人员(还有一个 gpu),我可以优化这一点,以便抓取的每个帧都由不同的工作人员处理吗?例如:

for j=1:frames
data = getsnapshot(vid);
      <do some analysis with worker mod((j),5)+2  i.e. worker 2 to 6 >  
end

问题是“数据”是从相机连续获取的,分析需要大约 2 轮循环,所以如果每次都有不同的工作人员(或核心)处理,最大 fps 可以是再次获取...

【问题讨论】:

  • 我很困惑。为什么你只有一个 matlabpool(1)?
  • 那只是将代码限制为一个worker,证明一个核心足以处理相机,因此其余的应该处理......
  • 您还对处理后的图像做什么?如果您在图形中显示它们,那么您必须考虑是否可以从多个工作人员更新 GUI..
  • 过时不是删除问题的理由。通常有人在很长一段时间内都坚持使用过时的版本,您也可以随时使用此问题/答案来指明更好的解决方案。

标签: image-processing parallel-processing video-capture matlab


【解决方案1】:

在我看来,这里的工作流程本质上是连续的..

您可以做的最好的事情是矢量化/并行化您的图像处理功能(因此您仍然可以一张一张地抓取图像,但您将处理分布在多个内核上)

【讨论】:

  • 使用各种标准函数处理图像:阈值(即 'image=image.*(image>threshold)' )、带滤波器的 conv2 和使用简单的局部最大值查找器的峰值检测。目前我使用的处理代码非常快,但如果我使用多个内核(我已经使用 matlabpool(1) 进行了检查),则不会提高速度。使用 gpu 可能会有所帮助,但是每次将变量转换为 gdouble 等都是有代价的。所以,我问是否可能的解决方案是分析每个事件(或图像)以不同的核心连续到达?或者 core1 的 image1,core2 的 image2 等等......
  • @wavepacket:我只是在这里集思广益,但如果您存储传入的图像,也许您可​​以有一个缓冲区/队列。它将使用timer 对象以一定的间隔不断填充。将其视为在后台运行。另一方面,您的代码将并行处理此图像队列;您一次从队列中获取一个图像,将每个图像分派给一个工作人员,该工作人员应该将结果放在另一个处理图像队列中。
  • @wavepacket:[...]。最后,您可以使用第二个计时器按顺序显示图像(假设负责的工作人员已完成,否则等待下一次迭代),其间隔与所需的帧速率 (FPS) 相匹配。同样,这只是一个想法,不确定是否可以实现:) HTH
【解决方案2】:

我想我找到了解决方案:

for i=1:frames

     for sf=1:6; % I got 6 cores
         m(:,:,sf) = getsnapshot(vid);
     end

     spmd 
         result=f(m(:,:,labindex));
     end
end

我设法通过 GPU 并行化获得更好的结果...

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多