我一直在使用生产者/消费者模式将 TPL 数据流用于图像处理管道。
我正在尝试找出最佳方法,以允许需要前一帧或持久对象的算法。
其中一个过程的示例是背景减法,其中通过将当前帧与动态背景模型进行比较来找到前景蒙版。
如何实现这一点的一个想法是在管道中创建一个循环:
是否有处理此类管道的标准方法?
是否存在与数据排序或异步操作相关的问题?
最佳答案
您不需要通过在管道中使用循环来使事情复杂化,就像在您的图像中一样,您所需要的只是将持久数据保存在一个变量中,该变量在调用处理函数之间持续存在。
如果您使用的是 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)
关于c# - TPL 数据流 : Persist previous data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25259515/