智能车图像部分——摄像头寻迹(学习笔记)

(1)摄像头基本原理

·中断处理
pclk 每输出一个像素值产生一次
href 每输出完一行产生一次
vsync 每输出一场产生一次
·DMA传输
摄像头初始化函数LQMT9V034-Init(void)中初始化DMA采集

(2)摄像头图像处理

·图像二值化(灰度图像变成黑白的图像,便于处理)
*二值化的方法:

1.设定固定阈值,大于阈值设定255白色,小于阈值设定0黑色。

2.通过OLED打印(串口比较费时间),通过按键对阈值进行调整(设置按键的外部引脚中断)。

3.利用大津法(遍历每个阈值,通过方差使黑白的差异达到最大化)。
·透视变换(变成俯视图,将矩形图片拉伸成梯形)

*图像矫正步骤:

1.获取摄像头视野角度,水平倾角,高度。

2.计算实际图像与获取图像的X、Y坐标对应关系。

3.对于缺失值进行补充

·误差分析(最小二拟合、斜率、曲率)
·赛道边缘提取(鲁棒性【检测到一个是白色,往右三个都是黑的,再往右三个也都是黑的】、准确度、记忆性)
*1.捕捉赛道左侧右侧边缘坐标。

 2.对于部分情况进行特殊处理。

 3.计算赛道中心。

*Canny边缘检测:梯度(颜色差异方向)方向,找边缘方向。

1.计算梯度幅度和方向。

2.保留局部梯度最大的点,以得到细化的边缘。

3.用双阈值法检验。


*路径规划及特殊处理:十字交叉路口,环岛识别检测(进环上三角,出环平路,再次遇到上三角),斑马线停车断路识别,入库停车。

(3)摄像头代码框架

*main.c:
{
关闭总中断,防止初始化过程中中断打断初始化(当然之后还要打开)
初始化引脚(OLED,电感,点击,舵机等)
标志位清空
图像处理
}

*Image Process(void)(图像处理函数):
{
开启摄像头的时刻设置阈值 (用大津法)
大的while循环(一直要进行图像处理)while(1)
采集完一张图像之后将标志置成1,if成立,进行下面操作,进行完这些操作之后再将标志位置成0,这样保证每次来一帧图像只对图像做了一次处理,对车做了一次控制,使摄像头采集频率和图像处理频率一致。

行中断场中断关闭
摄像头寻迹(清零处理参数,寻找边线,获取标志位,oled刷新,之后进行特殊情况判断,如果是短断路则把标志位置成0,跳出if语句进入else用电磁进行寻迹。)
}
*void PITO-ISR()(isr.c)PIT中断
用pit控制pid,pid需要时间间隔相同,所以放进中断里

*void PORTD-ISR(void)(摄像头采集中断处理函数)

*void findEdge()(中线提取函数)


【1.调整有效行数量,查看图像中线提取结果变化。

   2.调整不同行权重,查看输出值影响。

   3.取消记录图像每行中心点,每一帧中心点,运行查看中线提取效果。】 


{
从最下面一行开始向上遍历
while检测行数小于设置行数
if是最下面一行
开始寻找中心点设置为
提取左边缘
提取右边缘
判断左侧or右侧是否缺少边缘
计算中线,并记录中心点位置
}