背景介绍 自己之前就想学习c++,也都把《c++ primer plus(第六版)》看了3遍左右,每一遍都把代码抄写一次。目前基本的也都大概了解,起码知道怎么写的。这肯定是皮毛。
后来还买了《cuda c编程权威指南》、《数据结构、算法与应用c++语言描述》、《c++程序设计语言(第1~3部分)》、《算法导论》。这些书,都没怎么看完。也就是把《数据结构、算法与应用c++语言描述》的前7章对着书把代码抄写了一遍,大概理解了数据是怎么处理的,如何将算法转换成代码的。
但是我看不下去了,对于初学者来说,实在是太枯燥了,而且树上的代码还不完整,代码写出来容易报错,成就感低。
回想之前我学习R语言,都是在咸鱼上帮人做项目,帮人解决小问题,一点一点积累才成长起来的。前期虽然看了R的很多书,但是大部分书里面的内容都是没什么用的。最有用的竟然是google和stack overflow。后来我又继续自学了python,在反复看了基本基础的书之后,也是不断的尝试把之前R的项目用python来实现,有新的需求也都是使用python,用python不断的来整活,渐渐的python能力也是不断的在提高。
而今天,我作为C++初学者,也是遇到相同的问题,在有一点点基础上,如何有效的提高我的C++能力?我想还是整活!!
使用C++做一个yolov5视频检测 确定了使用C++整活,那么做一个什么样子的小项目呢?
我感觉第一点是项目特点是要能看得见:所见即所得,就像是之前入门R的时候,做的都是可视化的东西,马上出结果,让人非常有成就感。也就是渐渐的在了解ggplot2之后,不断的了解数据可视化的本质是数据处理,也渐渐的了解了如何使用R处理数据的一些方法。后来我在学习python的时候,也是这样,去做一些可视化,数据处理内容,不断的就提高了python能力。后来我使用python做了一个隔空输入的东西,是基于mediapipe和opencv的。
刚好后来我在B站上看到好多人都在学如何使用yolov5做物体检测,因为这个小项目我使用python肯定可以做的出来了,而且还比较熟悉python版本的opencv、python的数据处理矩阵方法(图像说白了,就是矩阵呗),而且opencv的python版本和c++版本都差不多。因此决定使用C++做一个物体检测。
找一个好的仓库
【cpp|c++入门学习——使用C++做一个yolov5视频检测】让直接写C++代码实现,肯定是不可能的,我肯定抄!先把别人的代码都跑通了再说。
于是我找到一个比较好的仓库(https://github.com/hpc203/yolov5-dnn-cpp-python),这个仓库代码我看500行代码不到。内容也还不错。
抄写代码
不是简单的无脑的抄,在抄写的时候,注意作者是怎么实现的、怎么封装数据流的,怎么把各个模块打包的。当然如果遇到真的不懂的,也不一定非要就去停下来思考,坚持抄写完成,然后可以运行起来,如果遇到不懂的,在后面调试的过程中,看看数据流是怎么样变化的。
其实啊,感觉和我之前使用python做的隔空输入的代码差不多。代码结构主要是:
- 定义yolov5的关键内容:比如加载模型部分、读取图像部分、检测对象部分、画对象检测框部分。
- openc处理图像部分:打开摄像头,录制视频做到实时显示图像、显示图像等。
- 将图像传递给yolov5模型检测。
另外,还要注意细节,比如作者是怎么给检测到对象的,怎么加载模型的等等。可以明显的感受到,在c++里面,非常喜欢使用类来处理数据,其实我觉得如果对python的类都比较理解的话,c++入门也没有那么难。
效果
中间遇到一些问题:
- 只是显示一个图片,没有任何对象被检测到,我很奇怪,然后就去看看自己的代码是不是写错了,找一找错误,调试代码,是不是什么部分参数、数据流不对。或者在issue里面看看是不是有遇到和我一样的小伙伴们。
- 效果很差,emmm,就是效果乱七八糟的,和我之前用python做出来的不一样。哈哈哈哈,这一部分,我就没调试了。我感觉可能是代码问题、模型问题,我暂时还不知道什么原因。
文章图片
【效果展示】
文章图片
我后来还把这个目标检测从静态图片换成了实时的版本(虽然真的很简单,但是起码有意思,哈哈哈哈)
总结
- 通过项目来学习C++,真的还可以,成就感之类的,比看书爽多了。而且掌握的技能更加真实,比如调试代码,检测bug之类的,还看到别人是怎么写的。
- 虽然效果很垃圾,但是起码有效果。而且数据流之类的都没问题,我感觉即使效果不好,后面也只需要小修改,不是大问题。
- 代码中还有很多内容,没琢磨透,还要反复去研究研究,搞懂了,估计对这一套逻辑就非常清洗明了,估计后面还可以做一些更加好玩的东西。
- https://learnopencv.com/read-write-and-display-a-video-using-opencv-cpp-python/
- https://github.com/hpc203/yolov5-v6.1-opencv-onnxrun
推荐阅读
- C++|C++学习——共勉(一)
- 论文阅读|论文笔记001:[ACMMM2019] IlluminIation-Invariant Person Re-Identificaton
- C++从入门到放弃|c++学习笔记1(实验1)_封装CMatrix类
- 机器视觉|机器视觉系列(一)——概述
- 笔记|解决ModularNotFoundError: No module named “cv2.aruco“
- 深度学习|深度学习day04-MNIST手写数字识别与模型使用
- 自动驾驶|全面解析特斯拉自动驾驶体系
- Linux系统网络编程|Linux系统(基础IO)
- C++编程学习指导|C++进阶(多态)