RoboMaster视觉教程(11)总结

这一系列教程终于写到最后一篇了,最开始设想还有两篇「程序自启以及进程守护」和「OpenCV GPU模块的使用与妙算 GPU 的 Zero Copy 」。

但是「程序自启」没什么好写的, Linux 程序自启无非就是在/etc/rc.local中添加我们的视觉程序的执行路径或者在bashrc里把路径放进去达到登陆自动运行的效果。

而「进程守护」之前想做但一直搁置了,只在树莓派上试过用看门狗实现死机重启,自己没有实践过就不写了。

另外的一篇「OpenCV GPU 模块的使用与妙算 GPU 的 Zero Copy 」本来想总结一下今年备赛时试图用妙算 GPU 优化程序的一些尝试,但因为最后做的是负优化,用了 GPU 速度反而慢了不少,再加上自己也不太熟悉就不写了。

Zero Copy 是 Tegra 系列芯片(TK1, TX1, TX2 等)支持的特性,就是 GPU 与 CPU 可以共享同一块内存,可以实现 CPU 处理后直接把这块内存交给显卡处理,无需再有复制到显存这一过程,但在实际测试中可能只能是自己写 CUDA 核函数来实现了。虽然 OpenCV 对这个特性有支持但几乎所有与 GPU 相关的处理函数都是先复制到显存再处理的,当初在这一部分折腾了好久……

Nvidia 对 TK1 的支持很有限,很多新的 API 都没有,不过 Nvidia 对 TX2 等更高级的芯片的支持比较完善,L4T Multimedia API (不支持 TK1 )这个 API 提供了一些视频解码、摄像头控制相关的函数,如果感兴趣可以好好研究,对充分利用硬件资源有很大帮助。

这期间我也折腾过 OpenCL 想用 Intel CPU 上的核显加速,最后因为 OpenCV 蛋疼的 UMat 的各种 bug 放弃了尝试(我怎么这么能折腾……)

Zero Copy 相关的一些资料:

「Zero Copy on Tegra K1」

「Zero-Copy: CUDA, OpenCV and NVidia Jetson TK1: Part 1 」

「Zero-Copy: CUDA, OpenCV and NVidia Jetson TK1: Part 2 」

「CUDA编程——zero copy」

写这几篇教程的目的是对做过的东西做个总结留个记录,另外也是希望给新入坑 RM 视觉组的同学一些入门的建议。大疆的这个比赛对视觉的要求其实不是特别高,尤其是在官方以及各大战队给出了开源代码后,仔细把开源代码读一遍基本上就可以摸清视觉识别的套路了。

但是视觉是一个特别综合的项目,如果没有一些教程的引路就很难入门。大多数视觉方面的书都在讲原理抑或是在讲解 OpenCV 库函数的使用方法,讲解应用方面的书比较少,往往是看了很多书也知道了很多函数怎么用,但是真正要用 OpenCV 做点东西就没有头绪了。

举个例子,做装甲板的识别。如果不知道摄像头可以调节曝光参数而直接用正常的曝光做的话,那太困难了,根本不知道怎么入手,我也是看了官方的开源代码才恍然大悟,原来可以这样。

视觉方面的书籍很少会提到摄像头有哪些参数、调节不同参数会有什么作用。就连 OpenCV 自身如果在编译的时候使用默认的设置可能连摄像头的分辨率都无法调节。

这几篇教程基本上从各个方面介绍了 RM 视觉需要注意的事项,提供了一些具体实现的思路,示例的代码除了我自己写的也参考了几个战队的开源代码并注出了来源,我对他们的无私奉献表示感谢。

因为自己精力及水平有限,教程中难免会出现错误,欢迎大家指正。