最近在看OpenMV的源码,和往前一样,经常会卡住,还是对C不够了解,一知半解的,这些文章不以读源码为主,但是会写一下我日常不见的东西。
openmv中用最小二乘法拟合轨迹实现代码分析.1
openmv(opencv)无人机巡线代码(参考用,还没有上机)
OpenMV IDE 2.6.7使用菜单详解
OpenMV IDE 自带demo分析.Ar_i2c_slave
OpenMV初体验
OpenMV最大的卖点就是相对廉价的嵌入式机器视觉了,但是瓶颈其实在IO和运算速度上面。前者就是使用PSRAM这样的缓冲器,后面就是使用主频高的MCU。但是一切都有尽头,无妨,几十块钱
目前官方支持得板子是这些得,别的芯片需要移植
在下载的库里面有很多的Bin文件,这里就是说明文件的作用
这个是makefile文件里面定义要用的编译器
这个定义的一些目录
OMV是这个项目最重要的东西,一切魔法的起源,UVC是USB Video devices,CM4是ARM内核,还有STM32的AI应用,以及下面就是一些CMOS的驱动了,也是最重要的。
这个就是缓存器的一些操作函数,无参数无返回的,那就是过程了
这个是控制CMOS的Cambus协议,要使用IIC,这里是针对STM32的
还有模拟的USB设备,传输视频使用
好像是一些高级的东西
还有延时的封装函数
STM32的片子最少都是F4的片子了
UVC在OpenMV里面是一个占比很大的部分,我为此写了一篇没有写完的文章。
这个就是我们树莓派Pico的配置文件了
OMV这个文件夹就是我们OpenMV这个项目的精华所在了
这个是以字符串数组写进去的demo
这些都是支持的传感器,在传感器这个目录里面,后期扩展的话,可以按照样式自己适配自己的传感器。
通过寄存器,cambus协议和传感器的头文件连在一起
文件在这里,项目里面一些公用的函数封装在这里
本土狗就见过这个传感器
ov2640的一个时钟的频率,和对传感器的一个初始化
这个是OV2640寄存器的定义
基本上都是宏定义了
传感器的一个初始化,看下这个操作的结构体
这里是传感器的ID,在结构体的一开始被定义
camsbus就是IIC的协议,上面第一个就是写了这个IIC的协议的地址,下面按照这个结构体里面写的是硬件的标志位,至于是什么意思,这里的注释就写进去了,有一些我还是看不懂的。
行同步信号回调 帧回调 看不懂 重启
这个就是回调的一个定义,就长这样的
私有的话,这里就是高和低我也不懂是哪里的
像素格式的功能开端,一个是YUV,可变格式,颜色,动态范围,拜尔格式
这个是图像的编码格式
这个是视频的分辨率列表
这个函数就吊了,具体其实定义就是这样的
怎么起作用呢?就是通过参数的不同输入达到一种不同的函数功能。
这参数设计的有Python那一套的感觉了
把传感器的结构体的使用范围扩展一下,以及使用2维数组来放分辨率的信息
下面还有一些函数,初始化有两种,一个是状态,一个是硬件
具体的实现,先不看。
但是可以看一下这个初始化的函数使用
结构体的值和函数的参数混在一起
每一个传感器大概都是通过这样的被定义
完整的传感器结构体定义,这里就写的很乱了,文章写了两天了都
传感器的各种状态,需要来输出
代码中大量看到Void*,有什么用?
void*有什么用呢?实际上我们在很多接口中都会发现它们的参数类型都是void*,例如:
代码语言:javascript复制ssize_t read(int fd, void *buf, size_t count);
void *memcpy(void *dest, const void *src, size_t n);
为何要如此设计?因为对于这种通用型接口,你不知道用户的数据类型是什么,但是你必须能够处理用户的各种类型数据,因而会使用void*。void*能包容地接受各种类型的指针。也就是说,如果你期望接口能够接受任何类型的参数,你可以使用void*类型。但是在具体使用的时候,你必须转换为具体的指针类型。例如,你传入接口的是int*,那么你在使用的时候就应该按照int*使用。
因为这里有大量的Makefile文件,VSCode推荐这个插件
这么贵的x1c连个win11都不能装,笑死了
文章没有达到自己预期的样子,寄了,国庆完了。
下次看海
代码语言:javascript复制https://github.com/openmv/openmv/tree/master/src/omv/boards/PICO
代码语言:javascript复制https://zhuanlan.zhihu.com/p/98061960