学习Rust的第1部分

我的眼睛用精明的边缘实现处理了。 我的网络摄像头在聚焦时出现了一些问题。 因此图像相当模糊。 这导致边缘检测不良。

老实说:这不是我第一次尝试学习防锈技术。 第一次失败相当困难,需要一段时间,直到我再次尝试。 我正在学习计算机科学,需要完成一些练习和作业。 因此,学习新语言不会花费很多时间。 此外,还有其他学生的项目。 他们在一个学期进行,而且时间也很有限。 设置编码准则非常耗时,因此大部分时间都被遗漏了。 这使我进入了c ++中一个带有多个线程和指针的特定项目。 结果是:内存泄漏。 寻找这些问题非常耗时,我决定再次尝试一下防锈技术。 它付出了。

我首先从生锈的书开始。 我已经读过第一版,但我很可能会推荐第二版。 此版本更加重视借阅和生活时间。 这两个概念是最难适应的语言,同时也是最令人惊奇的语言。 在阅读本书时,我进行了沙沙作响的练习。 这些是非常小的练习,您可以在浏览器中运行。 现在,我对语言有了一些概述。 接下来是什么?

我使用了一个叫作运动的网站。 它包含56个防锈练习,向您介绍更多防锈概念。 所有练习均具有单元测试功能,因此您知道何时正确实施了它们。 但是,运动的惊人概念是,您上传结果,其他人可以对您的解决方案发表评论。 您也可以查看该练习的其他结果。 当您不太确定解决方案时,可以从其他技术中吸取一些技巧。 我从中学到了很多。


之后,我对铁锈有了一个大致的了解,我想在一个真实的项目中尝试一下。 幸运的是,我在大学里有一个新项目,我一个人在做。 目标:在GPU上实现眼睛跟踪算法。

该实现在 GitHub 可用 不要期望最优化的解决方案或最正确的解决方案。 正如我提到的那样,我独自工作,时间很匮乏。

因此,我决定对该项目使用rust。 首要任务是评估生锈是否与CUDA结合。 事实证明,CUDA在编译时会编译其内核,因此需要一个自己的编译器。 要生锈就不容易了。 好吧,这真是令人讨厌。 好吧,OpenCL呢? 我了解CUDA。 因此,一段时间之后我就可以进入OpenCL。 我找到了一些OpenCL软件包,并选择了ocl。 我编写了一个小型测试程序来对其进行评估,对此我印象深刻。 它剥夺了很多样板代码,一切都正常了。

我开始实现Canny边缘检测(在代码中:OpenCL,rust)。 我没有遇到任何问题,这是一个愉快的经历。 我知道我可以相当多地提高内核的性能,但是时间却很少。 我需要在程序中添加更多功能和算法,以使其可用或正在进行使用。 那时我可以读入一张图像,对其进行处理并保存。 这不是实时的眼动仪。 因此,我调查了摄像头包装箱。


我开始使用camera_capture,它将video4linux板条箱与Windows的DirectShow板条箱连接在一起。 在Windows和Linux上可以捕获相机。 抱歉,OSX :(。但是我已经创建了自己的带有一些其他功能的库的分叉。在Windows版本上无法设置所需的FPS。我在此处和此处进行了修复。然后输出始终为RGB。我添加了编译时功能,可以将其更改为Luma或RGBA。在某些时候,我需要此功能来节省一些额外的转换。

为了显示所有内容,我使用了活塞项目。 更具体地说,是活塞窗口。 显示纹理的代码在此处可用。 我想添加其他流方法。 所以我需要一个抽象的图像采集。 锈蚀是通过特质完成的。 我为此付出了很多努力。 我的第一种方法是利用线程和通道将其传递给主函数。 但是在结构实现中启动线程是棘手的。 当该结构的生存期结束时,线程也会停止。 当它应该是一个长期运行的线程时,这并不是很理想。 经过一番尝试和错误后,我完全放弃了线程方法,并最终获得了以下特征:

  pub trait Stream {
   fn setup()->自我;
   fn fetch_images(&self)-> Box <Iterator >;
   fn get_resolution(&self)->(u32,u32);
 } 

fetch_images()我返回一个迭代器。 在stackoverflow的帮助下,我最终得到了上述解决方案。 那时我没有每天晚上都生锈。 现在,我将在stackoverflow答案中使用impl trait版本。 我的网络摄像头流实现在此处提供。 现在,我可以添加更多的拖缆,并以最小的努力将它们换出。


总结:在本部分的最后,我得到了一个程序,该程序:

1.将图像从网络摄像头传输到GPU

2.执行坎尼边缘检测

3.显示处理后的图像

在下一部分中,我将讨论轮廓处理和将头围绕合成而不是继承。