驴车的源码分析第三弹,今天事情比较多,趁着早上有空赶紧更了。
先回答一些疑问:
这里是两个相机,但是不是立体,只是合成了新图像
路径如图
这里是就是证据,前面的来源是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,长宽和通道。
还有一个模拟器,下篇文章写。