这篇文章记录我在ai开发中面临到的问题,以及对于如何更高效学习的思考
第一部分# 学习目标:
快速掌握openmv是怎么在嵌入式开发中应用,尝试能否优化识别算法,实现在自动锁敌系统中无缝识别
学习内容:
先了解摄像头在这个过程中发生了什么,他是怎么传输的,数据如何被处理,如何用数学描述这得个过程,如何代码描述这个过程
学习时间:
2026年10月26日晚
学习产出:
第一部分,在学习过程中遇到上下文被污染问题,一些错的,不严谨的文章被ai读取,输出,并且在输出的过程中会面临解释不全,版本过于陈旧,我开发了一个skill,让ai高精度输出,读取之前先审查一遍文章的严谨性,权威性,并且整理出来一个大纲让读者快速理解讲了什么,提升学习效率,如果有人对于这个skill感兴趣,私信我发你。
第二部分,具体学习理解,dvp接口技术原理研究## 英文期刊(DVP 接口标准原理,最贴合你问的 “像素怎么传给 MCU”)
标题:A DVP-Based Bridge Architecture to Randomly Access Pixels of High-Speed Image Sensors
期刊:EURASIP Journal on Embedded Systems
链接:https://jes-eurasipjournals.springeropen.com/articles/10.1155/2011/270908EURASIP Jo…
学习理解:XCLK 是主控给摄像头提供的时钟,RGB565 两个时钟信号传输一个单位像素,因为他是两个字节一个像素,每传输一行数据 href 标记一下,VSYNC 则是标记一帧数据的传输的结束或者开始
上面是摄像头传输的数据的过程,下面的是stm32处理信号的
dcmi是stm32接受dvp时序信号的外设
DMA把数据搬运到ram里的帧缓冲层里去,为mcu腾出处理时间防止数据流失冲突,单缓冲只用一块独立缓存,省内存,上限帧率低,易花屏,,dma和mcu不能同时工作,双缓存开销适中、时序简单;缺点:处理稍微慢一点就丢帧,三缓冲除了费内存没有短板,也需要队列管理,写调度,具体案例:
#include<stdint.h>#include<stdbool.h>// ========== 配置区 ==========#defineFRAME_BUF_CNT4// 4缓冲队列,可以改成3/5#defineFRAME_WIDTH320#defineFRAME_HEIGHT240#defineFRAME_PIX_FORMAT2// RGB565 = 2字节/像素#defineFRAME_SIZE(FRAME_WIDTH*FRAME_HEIGHT*FRAME_PIX_FORMAT)// 帧缓冲结构体typedefstruct{uint8_tbuf[FRAME_SIZE];bool ready;// true:这一帧采集完成,等待上层读取}FrameBuf_t;// 队列staticFrameBuf_t frame_pool[FRAME_BUF_CNT];staticuint8_tq_wr_ptr=0;// 写指针:中断里DMA写入staticuint8_tq_rd_ptr=0;// 读指针:主循环取帧接下来我详细了解了一下数据处理时候到底发生了什么,本质上就是在摄像头发过来的像素数据上做计算,我现在对于数据处理这一部分有些理解的不是很透彻,为什么yolo能够框住一个不规则物体,而且框框还不会因为物体变化的位置变化而变形,我突然意识到人脸识别本质上也是这样的计算处理
在大概理解了一下摄像头数据传递到mcp里头是怎么处理的时候,我诞生了一个想法,在传过来的数据上做一个编码器,以帧为最小重复单位,传过来的每一个像素点有独立的编码,这样的话就能做到能让mcp理解这个像素点在时间单位上是怎么变化的了,也能锁定画面中心是哪个像素点了。以上学习任务结束于2026年10月27日2点,整个学习时间4小时,初步掌握摄像头传输出来的数据如何被处理,如何被传输等等原理,并且诞生出来新的对于技术的思考,收获颇多。三个目标任务完成两个,最后一个有点累了熬不住了。
补充知识点:
YOLO 边界框回归原理
YOLO 把图像切成 S×S 的网格,每个网格负责预测落在其中的目标。对每个网格,网络输出一个置信度、一个中心点偏移 (tx, ty) 和宽高 (tw, th),再经激活函数还原成真实坐标:中心点被限制在本网格内,宽高则通过指数映射还原为相对整幅图像的比例。关键在于,网络回归的是「中心点 + 宽高」这 4 个数值,而不是去拟合物体的轮廓像素,所以无论物体是圆形、人形还是不规则形状,输出的始终是一个与坐标轴平行的矩形,框的形状不会随物体形变而改变,只会随中心点和尺寸变化而平移、缩放。
cx = (sigmoid(tx) + grid_x) / S # 中心点 x,限制在所属网格内 cy = (sigmoid(ty) + grid_y) / S # 中心点 y w = anchor_w * exp(tw), h = anchor_h * exp(th) # 宽高按 anchor 缩放这也正是人脸识别的同源之处:两者都是「在特征图上做回归 + 分类」,人脸检测框同样由中心点和宽高回归得到,只是损失函数和 anchor 设计针对人脸尺度做了调整。