我一直在使用生产者/消费者模式的图像处理管道使用TPL数据流。
我正在尝试找出最好的方法来允许需要前一帧或持久对象的算法。
其中一个过程的示例是背景减法,其中通过将当前帧与动态背景模型进行比较来找到前景蒙版。
如何实现这一目标的一个想法是在管道中创建一个循环:
是否有接近此类管道的标准方法?
是否存在与数据排序或异步操作相关的问题?
答案 0 :(得分:3)
您不需要通过在管道中使用循环来使事情复杂化,就像在图像中一样,您只需要将持久数据保存在对处理函数的调用之间持续存在的变量中。
如果您正在使用lambda,那么该变量可以是lambda的局部变量:
IPropagatorBlock<InputImage, OutputImage> CreateProcessingBlock()
{
InputImage previousImage = null;
return new TransformBlock<InputImage, OutputImage>(
inputImage =>
{
var result = Process(inputImage, previousImage);
previousImage = inputImage;
return result;
})
}
如果您在某个对象上使用实例方法,该变量可以是该对象上的实例字段:
class Processor
{
InputImage previousImage;
public OutputImage Process(InputImage inputImage)
{
var result = Process(inputImage, previousImage);
previousImage = inputImage;
return result;
}
}
…
new TransformBlock<InputImage, OutputImage>(new Processor().Process)