【问题标题】:design pattern(s) or best practice for image acquisition and image processing in real time application实时应用中图像采集和图像处理的设计模式或最佳实践
【发布时间】:2012-08-14 16:33:42
【问题描述】:

首先,通过“实时”,图像的图像处理在此应用程序中应该花费 0.1 秒或更短的时间。

在我们的应用程序中,除了主线程外,还有三个线程正在运行。一个用于图像采集,第二个用于图像处理,第三个用于机器人。在两个线程之间,有一个图像队列要共享,因此当相机将图像入队和机器人将处理后的图像出队时,成像处理器将图像出队并将处理后的图像入队。您可能已经注意到的一个限制是,处理后的图像应该按顺序排列,这意味着图像的顺序与图像采集中的顺序相同。

是否有任何设计模式或最佳实践可应用于此架构。

【问题讨论】:

  • 听起来很合理。如果您遇到性能问题,也许您应该进行一些分析以确定瓶颈?如果是图像处理,您可能会添加另一个或两个线程,但是您可能需要在图像类中使用序列号以确保处理后的顺序 O/P。 O/P 去哪儿了?
  • @UkuLoskit 感谢您的指点,但我认为我们已经在使用图像队列同步了。
  • @MartinJames 在我们的例子中,处理/更改的图像会发送给机器人。所以是的,我认为保持顺序很重要。但我认为,为每个图像处理设置线程将是一个不错的选择。感谢您的评论

标签: c++ design-patterns


【解决方案1】:

pipes and filter 模式非常适合这种情况。

  • 采集过滤器需要按顺序串行。
  • 处理过滤器可以并行运行。
  • transport-to-robot 过滤器需要按顺序排列。

为了使用现有技术实现这一点,我看到处理大量数据的实时应用程序使用英特尔的Threading Building Blocks (TBB)。在 Thread Building Blocks Tutorial 中,“在装配线上工作:管道”部分描述了类似的问题:

将使用一个简单的文本处理示例来演示使用管道和过滤器执行并行格式化。该示例读取一个文本文件,对文本中的每个十进制数字求平方,然后将修改后的文本写入一个新文件。 [...] 假设原始文件 I/O 是连续的。平方滤波器可以并行完成。也就是说,如果您可以非常快速地串行读取n 块,则可以并行转换每个n 块,只要它们以正确的顺序写入输出文件即可。

以及随附的代码:

void RunPipeline( int ntoken, FILE* input_file, FILE* output_file ) {
  tbb::parallel_pipeline(
    ntoken, 
    tbb::make_filter<void,TextSlice*>( 
      tbb::filter::serial_in_order, MyInputFunc(input_file) )
  & tbb::make_filter<TextSlice*,TextSlice*>( 
      tbb::filter::parallel, MyTransformFunc() )
  & tbb::make_filter<TextSlice*,void>(
      tbb::filter::serial_in_order, MyOutputFunc(output_file) ) );
}

无论是否使用 TBB,它都可以作为管道和过滤器模式的出色实现参考,将模式与算法分离,同时提供控制过滤器的数据顺序/线程的能力。

【讨论】:

    【解决方案2】:

    我认为你的方法是正确的。

    可能的改进可能是使用线程池,例如用于图像处理(特别是如果它需要比采集更多的时间)。你可以考虑 OpenMP 或 boost 线程池,或 boost::asio::io_service

    【讨论】:

    • 我想我知道线程池是什么。但我的问题是如何在这个架构中使用线程池。
    • @david 您将有一组线程从队列中读取图像并并行处理它们,而不是一个处理线程。实际实现取决于您的需求
    • 知道了,但一个限制是处理的图像应该按顺序进行下一阶段。我想我需要编辑我的问题。
    • 仍然可以在以下场景中使用线程池来处理线程:从队列中获取的不是一个,而是 NUMBER_OF_CORES 个图像,并将它们传递给线程池执行器,该线程池执行器并行处理这一束。在这种情况下将保留序列
    • 好的。这说得通。程序可以记住顺序。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2018-01-03
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多