DonkeyCar源码阅读.3(操作记录+若干图像处理)

2022-06-15 15:57:12 浏览数 (1)

驴车的源码分析第三弹,今天事情比较多,趁着早上有空赶紧更了。

先回答一些疑问:

这里是两个相机,但是不是立体,只是合成了新图像

路径如图

这里是就是证据,前面的来源是webcam,后面的来源是OpenCV的捕捉。

这个是CvCam的类,以及有的函数。

默认是0索引的相机

为了取得好的图片效果,需要设置摄像头的参数。

假如摄像流为 cap, 那么设置参数是cap.set(参数编号,参数)

获取参数值的函数是 cap.get(参数编号)

下面是读取一帧的封装,在相机可用的前提下,读取,存在frame内。

持续读帧的代码,使用while循环,running来自于:

上面的这里

使用这个函数的时候可以获取当前的一帧新图像

这些函数连起来使用就是这样的写法

关闭摄像的写法?这里不是关闭硬件,只是在软件的层面处理,先设置标志位,接着延时一下,关闭摄像头。

看下初始化一辆车的过程。

一个车的类

一开始的初始化内容,指向了一个Memory

保存字典自己实现的类

先建立一个新的空白字典

这个方法应该以与键相关联的方式存储值,以便之后能够使用__setitem__来获取。当然,这个对象可变时才需要实现这个方法。

如果key是元组,就打印(傻逼语言),自己看把。下面新建了两个空白元组。

接着打包进去

凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方__getitem__。

一般如果想使用索引访问元素时,就可以在类中定义这个方(__getitem__(self, key) )。

重用了updata方法,更新键值对。

put方法不记得了。。。参数是key和输出?看懂了,使用一群key取一群值。

这个函数好,记住了,下次这样写。

下面就是常规的函数了,get是对上面的友好封装。

另外还有一个类,作用未知先读着。

初始化一个类

记录一个动作的时间戳应该是

完成部分

获得现在的时间,取一个记录里面最后一个内容,做差,接着来判断时间,把操作的间隔写进去,这个好像是上传操作内容设计的。

完整的记录函数,先打印一条日志。接着建立一个文字表格:

效果如图

表头,数值,然后后面是使用了列表推导。

接着从记录里面一个一个的处理,计算他们的四分位数。row的写法复杂,没有看懂。但是肯定是处理了row,将内容加到pt。最好以日志方式打印。

numpy函数

OK,才读完

看看add函数

确保内容的正确,先使用断言前置判断

part不懂?看看使用,知道是一个数据源,接着写了一个字典,把内容写进去

使用

threaded是一个线程标志,是不是要按照多线程的方式运行

从列表里面移除来源

循环回路的频率,以及要循环的最大数,后面是布尔值要不要写到屏幕。

一大坨,呜呜呜不想写了

看这个,设置开始记录,读取标志,开始写入

操作的数据结构在此

打印日志,开始记录,读取当前的时间,以前循环计数 1,下面这个函数我接下来读,先放着,反正就是写入操作。

没有有循环限制以及开始计数的情况下,把开关关了

睡眠时间是频率取倒数-现在的时间-开始的时间

如果时间大于0,就重新当作初始时间运行。在下一个支路,判断verbose标志位,如果有就输出到shell其实就是日志。

如果开始输出以及(其实是200ms记录一下),就写入到Table里面。

一个漂亮的结尾

还有两个函数没有读,偷懒,下次补上。

拍到的照片要给Stereo的函数处理,看看是什么。

这是一个图像类

只不过不是立体的处理,而是要合成照片。

两个image非空的情况下,先把a照片的信息读出来,前面是元组解包,只要W,H。

接着是从自己实现的工具类里面,把两个图转换了颜色,成了灰度图像。只要做了一下减法。

开始重新创建照片,先用zeros函数,按照解包的参数新建空白容器。接着把三色通道写入。感觉效率有点慢。

如果照片非空,直接就是空表了。

之后转换成数组传出来。

如果是D435呢?其实这里是D435i应该是,以为有IMU数据。

相机参数,要使用RGB,深度,IMU和设备的ID数据。

8个数据一起写入

当然这里可以重写方法的,不是每个人都能买的起D435的。后面是如果要reszie的操作。

用的or,有一个参数不一样就ok,长宽和通道。

还有一个模拟器,下篇文章写。

0 人点赞