用于实时应用中的图像采集和图像处理的设计模式或最佳实践

时间:2012-08-18 13:57:20

标签: c++ design-patterns

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  • 采集过滤器需要按顺序串行。
  • 处理过滤器可以并行运行。
  • 传输到机器人过滤器需要按顺序串行。

为了使用现有技术实现这一目标,我发现处理大量数据的实时应用程序使用的是英特尔Threading Building Blocks(TBB)。在线程构建块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,它都可以作为管道和过滤器模式的一个很好的实现参考,它将模式与算法分离,同时提供控制过滤器的数据顺序/线程的能力。

答案 1 :(得分:1)

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

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