首页 > 技术知识 > 正文

最近在看OpenMV的源码,和往前一样,经常会卡住,还是对C不够了解,一知半解的,这些文章不以读源码为主,但是会写一下我日常不见的东西。

OpenMV初体验

OpenMV源码细读-opencv 编译

OpenMV最大的卖点就是相对廉价的嵌入式机器视觉了,但是瓶颈其实在IO和运算速度上面。前者就是使用PSRAM这样的缓冲器,后面就是使用主频高的MCU。但是一切都有尽头,无妨,几十块钱

OpenMV源码细读-opencv 编译1

目前官方支持得板子是这些得,别的芯片需要移植

OpenMV源码细读-opencv 编译2

在下载的库里面有很多的Bin文件,这里就是说明文件的作用

OpenMV源码细读-opencv 编译3

这个是makefile文件里面定义要用的编译器

OpenMV源码细读-opencv 编译4

这个定义的一些目录

OMV是这个项目最重要的东西,一切魔法的起源,UVC是USB Video devices,CM4是ARM内核,还有STM32的AI应用,以及下面就是一些CMOS的驱动了,也是最重要的。

OpenMV源码细读-opencv 编译5

这个就是缓存器的一些操作函数,无参数无返回的,那就是过程了

OpenMV源码细读-opencv 编译6

这个是控制CMOS的Cambus协议,要使用IIC,这里是针对STM32的

OpenMV源码细读-opencv 编译7

还有模拟的USB设备,传输视频使用

OpenMV源码细读-opencv 编译8

好像是一些高级的东西

OpenMV源码细读-opencv 编译9

还有延时的封装函数

OpenMV源码细读-opencv 编译10

STM32的片子最少都是F4的片子了

OpenMV源码细读-opencv 编译11

UVC在OpenMV里面是一个占比很大的部分,我为此写了一篇没有写完的文章。

OpenMV源码细读-opencv 编译12

这个就是我们树莓派Pico的配置文件了

OpenMV源码细读-opencv 编译13

OMV这个文件夹就是我们OpenMV这个项目的精华所在了

OpenMV源码细读-opencv 编译14

这个是以字符串数组写进去的demo

OpenMV源码细读-opencv 编译15

这些都是支持的传感器,在传感器这个目录里面,后期扩展的话,可以按照样式自己适配自己的传感器。

OpenMV源码细读-opencv 编译16

通过寄存器,cambus协议和传感器的头文件连在一起

OpenMV源码细读-opencv 编译17

文件在这里,项目里面一些公用的函数封装在这里

OpenMV源码细读-opencv 编译18

本土狗就见过这个传感器

OpenMV源码细读-opencv 编译19

ov2640的一个时钟的频率,和对传感器的一个初始化

OpenMV源码细读-opencv 编译20

这个是OV2640寄存器的定义

OpenMV源码细读-opencv 编译21

基本上都是宏定义了

OpenMV源码细读-opencv 编译22

传感器的一个初始化,看下这个操作的结构体

OpenMV源码细读-opencv 编译23

这里是传感器的ID,在结构体的一开始被定义

OpenMV源码细读-opencv 编译24

camsbus就是IIC的协议,上面第一个就是写了这个IIC的协议的地址,下面按照这个结构体里面写的是硬件的标志位,至于是什么意思,这里的注释就写进去了,有一些我还是看不懂的。

OpenMV源码细读-opencv 编译25

行同步信号回调+帧回调+看不懂+重启

OpenMV源码细读-opencv 编译26

这个就是回调的一个定义,就长这样的

OpenMV源码细读-opencv 编译27

私有的话,这里就是高和低我也不懂是哪里的

OpenMV源码细读-opencv 编译28

像素格式的功能开端,一个是YUV,可变格式,颜色,动态范围,拜尔格式

OpenMV源码细读-opencv 编译29

这个是图像的编码格式

OpenMV源码细读-opencv 编译30

这个是视频的分辨率列表

OpenMV源码细读-opencv 编译31

这个函数就吊了,具体其实定义就是这样的

怎么起作用呢?就是通过参数的不同输入达到一种不同的函数功能。

OpenMV源码细读-opencv 编译32

这参数设计的有Python那一套的感觉了

OpenMV源码细读-opencv 编译33

把传感器的结构体的使用范围扩展一下,以及使用2维数组来放分辨率的信息

OpenMV源码细读-opencv 编译34

下面还有一些函数,初始化有两种,一个是状态,一个是硬件

具体的实现,先不看。

OpenMV源码细读-opencv 编译35

但是可以看一下这个初始化的函数使用

OpenMV源码细读-opencv 编译36

结构体的值和函数的参数混在一起

OpenMV源码细读-opencv 编译37

每一个传感器大概都是通过这样的被定义

OpenMV源码细读-opencv 编译38

完整的传感器结构体定义,这里就写的很乱了,文章写了两天了都

OpenMV源码细读-opencv 编译39

传感器的各种状态,需要来输出

代码中大量看到Void*,有什么用? void*有什么用呢?实际上我们在很多接口中都会发现它们的参数类型都是void*,例如:

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推荐这个插件

OpenMV源码细读-opencv 编译40

这么贵的x1c连个win11都不能装,笑死了

文章没有达到自己预期的样子,寄了,国庆完了。

审核编辑:刘清

猜你喜欢