几个月前,我开始从事一个项目,开发一种算法来处理从线扫描相机设备获取的数据(例如,每 300us 一行 384 像素)。因为我是一名工程师而不是程序员,所以我开始使用 Python 来最小化学习曲线。在 SX 的帮助下,我成功地构建了一个 Python 应用程序(最终代码超过 2000 行),并成功地创建了一个图像处理算法来处理数据。我给客户留下了深刻的印象,他们希望将其提升到一个新的水平。现在,我需要它是实时的……这意味着 C++。我得到了 Koenig 和 Moo 的 Accelerated C++ 并开始阅读。所以,请对我放轻松。我喜欢学习编程,但我没有受过正规培训。我正在尽我所能!
我现在有一个 C++ 原型 GUI(使用 Qt),它包含通过 CameraLink 接口与相机通信所需的所有库。采集代码位于其自己的线程中并向 GUI 发出信号。所以,我的基础已经到位。我可以使用我当前的代码获取尽可能多的数据行,但我现在正试图弄清楚如何围绕它构建一个应用程序。甚至编写了一个与 Qt(MOCing 等)一起使用的自定义 makefile
无论如何,对于应用程序,我想要两种模式(这些是问题):
(1) “实时”视图...其中线扫描数据由 GUI 实时显示。我正在考虑使用循环缓冲区(例如,Boost::circular_buffer)来实时保存数据,并通过发出的信号将缓冲区的副本(memcpy?)简单地传递给 GUI。这站得住脚吗?我觉得缓冲区的副本是必要的,因为循环缓冲区将每 300us 左右更改一次,我不知道主事件循环能否跟上。同样,数据采集存在于自己的线程中。它必须比这更复杂吗?我是否必须在读取缓冲区时从缓冲区中弹出数据而不是使用循环缓冲区?我觉得循环缓冲区是要走的路,因为这正是我想要显示的那种图像。
(2) 数据处理模式...其中行扫描数据以块(即 384 x 384)像素的形式发出。以 300us (~3,333 Hz) 的扫描速率,即每 100ms 左右一个块或帧。在这 100 毫秒内,我需要对数据进行规范化、对象检测、阈值处理等。我计划在运行实时内核补丁的 Linux 机器上运行它。我觉得应该跟上。我需要在数据采集和数据处理线程之间进行通信……我需要套接字吗?
我在这里寻找有关如何开始使用这两个部分的建议。第二个更关键,但第一个将帮助我想象正在发生的事情。最终,我希望两种模式同时运行。我花了一周的大部分时间才走到这一步……但需要确保我的计划走在正确的道路上。