c++ - 从线扫描相机显示线图像的最快算法或方法是什么

标签 c++ algorithm

我们有一台线扫描相机,每秒可生成 300 幅线图像。我们希望以 FIFO 的方式在 ImageView 上显示行,以便 View 的最后一行显示最新的行图像,同时将前面的行向上移动以进行行更新。

如果我可以像过去那样用 C 访问视频内存,我会这样做

memcpy(videoMem, videoMem+lineWidth*pixelSize, pixelSize*lineWidth*(nLines-1));
memcpy(videoMem+pixelSize*lineWidth*(nLines-1),newLine,lineWidth*pixelSize);

但我不知道这是否是即使直接访问视频内存我也能做的最好的事情。

现在我明白了直接访问显存是不可能的,也不可取。在那种情况下,最好的方法是什么?专家的任何意见将不胜感激。

它是 Windows 7 中的桌面 PC 应用程序。

更新

如我所料,看来我必须处理一种循环缓冲区。在我的例子中,棘手的部分是写入缓冲区是逐行的,而读取是逐屏的。所以 end 指针到达缓冲区的物理末尾,需要额外的内存拷贝才能将屏幕内存传递到视频中。我想 Bip buffer 可以解决这个问题。还有其他想法吗?

最佳答案

你不能 memcpy 重叠的内存,这就是 memmove 的目的。不过,只要复制以正确的顺序发生,您就可以使用 memcpy。在您的平台上试用它,看看它是否有效。

主要的实现问题是如果有两个单独的写入会导致闪烁。如果是这种情况,您必须先将新图像写入缓冲区,然后将整个缓冲区一次性全部写入显存。

一般来说你不会读取显存。要显示的数据应该在其自己的内存区域中。总而言之,您有 3 个内存区域:

  1. 要显示的数据
  2. 显示缓冲区
  3. 显存(或等效物)

标准流程是一步写1->2,然后写2->3。但是,如果没有闪烁,则可以直接进入 1->3,无需缓冲。除此之外,没有超出你所写的神奇算法

关于c++ - 从线扫描相机显示线图像的最快算法或方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697575/

相关文章:

c++ - 在qt中以最大化模式设置窗口标题

c# - 如何在 C# 中创建值生成器 ala hex

c++ - 计算斯特林数的动态规划方法

algorithm - 如何将数学描述的算法翻译成编程语言?

c++ - 我在微 Controller stm32f373 发现中点亮 LED 时遇到问题

c++ - XCode 中的 fprintf C 有问题

c++ - OpenGL C++ Plain Subdivison in QUADS (Radiosity) patches on arrays

c++ - `std::this_thread::sleep_for()` 是否有任何特定于平台的限制?

c++ - Median of Medians 算法误解的中位数?

c# - 外汇订单简化算法