【问题标题】:C# - slow float array processing (frame averaging)C# - 慢速浮点数组处理(帧平均)
【发布时间】:2018-05-17 00:15:26
【问题描述】:

我在 .net 框架上使用带有 winform GUI 的 c# 构建项目。该程序的目的是从图像采集卡中获取数据(图像帧)并在对其进行一些预处理后保存数据。

插入的摄像头速度非常快,像素大小为 640x480,每个像素为 16 位,工作速度为每秒 350 帧。

我添加了制造商提供的库,它为每个传入帧引发一个事件并将数据作为一维 int16 数组传输。

我想要做的是平均每秒的一堆帧并将结果以二进制形式保存为浮点数组。看这里:

void Camera_OnRawImage(object sender, short[] data)
{
     float[] frame = Array.ConvertAll(data, x => (float)x);

     this.AverageProcess.AddImage(frame);
}

我的问题是有大量数据进入我的应用程序。因此程序无法在下一帧等待触发事件之前处理和保存所有数据。

我已经尝试过不同的方法,例如: - 多个线程并行计算数组 - 使用编组方法获得更好的数组访问 - 将数组转换为 MathNET 数组并使用 MathNET 库上的 INTEL MKL 来加快处理速度。看这里:

internal void AddImage(float[] image)
{
   currentFrameOfMeasurement++;

   Vector<float> newImage = Vector<float>.Build.DenseOfArray(image);
   newImage = newImage.Multiply(preAverageFactor);

   var row = FrameMat.Column(currentFrameOfPeriod).Add(newImage);

   FrameMat.SetColumn(currentFrameOfPeriod, row);

   currentFrameOfPeriod++;

   if (currentFrameOfPeriod >= this.Settings.FramesPerPeriod)
   {
        currentFrameOfPeriod = 0;
        currentPeriodCount++;
   }
}

但这也有点慢。抓取数据时 RAM 正在增加。我的方法需要超过 10 毫秒 - 这太慢了。 必须能够处理和保存数据。制造商有一个应用程序正在对抓取的数据进行大量处理。看起来程序是用delphi编写的。也许他们正在使用更好的库来完成所有这些操作。

我的问题是现在。有没有人建议我可以做些什么来加快处理和计算这些数组。

提前谢谢你

【问题讨论】:

  • 您可以将数据推送到BlockingCollection 并从那里(在不同的线程中)使用它吗? 您的消费者也许能够将其写入内存映射文件?

标签: c# arrays image-processing mathnet-numerics


【解决方案1】:

使用同步队列 (here) 功能并在进入程序的所有帧中排队,并编写一个线程来处理队列中的项目。

【讨论】:

  • ConcurrentQueue相比有什么好处?
  • 不确定有什么好处,但两者似乎都在做同样的事情 - 线程安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2021-07-16
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多