一、硬件介绍
(1)主芯片STM32F407VET6
1.支持单精度浮点运算,芯片硬件资源包括192KB内部RAM,512KB-1MB的FLASH(具体看芯片型号),采用分散内存架构128KB内部SRAM,64KB高速RAM,CPU可以直接访问此部分的内存(访问速度为CPU主频速度),因此通常采用内部SRAM图像采集和显示,采用CCM-RAM进行图像处理和识别,能充分发挥M4内核的优势.
2.具有DCMI数字图像采集接口,直接采集并口摄像头图像并使用DMA传输,包含USB,PWM,USRT,SPI,I2C,CAN等众多外设,还可以采用FMC驱动并口屏和扩展外部SRAM,采用SPI、QSPI外挂FLASH或者SD卡。
内部SRAM 起始地址 0x2000000 长度 0x20000 (128KB)
CCM RAM 起始地址 0x1000000 长度 0x10000 (64KB)
QVGA图像大小:RGB5656:320x240x2/1024=150KB
灰度图Y8: 320x240/1024=75KB
F407主芯片最大可以处理QVGA分辨率的图像,处理采用RGB格式时要采用分快内存进行处理,采用灰度图时可直接采用内部SRAM进行采集和处理。
(2)摄像头
OV7670、OV7725,OV2640等OV系列的摄像头都是OV公司的CMOS数字摄像头,硬件接口上都采用了并行时序,一般FPC接口的采用DVP标准,2.54接口的按照实际生产商接口顺序而定,引脚定义一般包含VSYNC(场信号)、HSYNC(行信号)、PCLK(像素时钟信号)、XCLK(外部时钟)、D0-D7数据信号、SCL/SDA(SCCB接口兼容I2C协议),PWDN(接GND),RST(拉高),一般STM32图像采集方法是:以外部时钟为例,将PA8配置成外部时钟输出,输出符合摄像头的采集时钟,采用SCCB接口配置好摄像头的寄存器(包括图像采集的时钟倍频分频,图像采集分辨率,图像采集的行和列的起始位置和结束位置,图像效果,3A,DSP,伽马曲线,镜头矫正等等),之后按照摄像头的时序进行图像采集(具体时序和寄存器配置查看对应摄像头的数据手册)。
(3)LCD液晶屏
ST7735,ST7789,ILI系列都有SPI驱动的液晶显示屏,最重要的是LCD的读写时序配置以及LCD参数配置,具体的可以查看对应的液晶IC数据手册
(4)舵机
舵机一般有SG90(塑料齿)、MG90S(金属齿)、MG995/996等,驱动方法都是采用PWM信号驱动。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。
以180度角度伺服为例,那么对应的控制关系:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
以168M主频的F407主芯片控制舵机,首先设置一个20ms周期的PWM波系统主频168M,
TIM外设时钟2分频//自动重装载值为2000,
分频系数840168/2/840=0.1M 0.1M/2000=50Hz 20ms周期的PWM波
0度----0.5/202000=50;
45度----1.0/20
2000=100;
90度----1.5/202000=150;
135度----2.0/20
2000=200;
180度----2.5/20*2000=250;

二、图像采集处理

1.硬件配置流程
(1)DCMI_GPIO配置DCMI配置
包含行HSYNC、场VSYNC、以及像素信号PCLK,以及数据信号,采用8bit模式进行采集,即每一个像素时钟传入DCMI_DR数据寄存器8位数据。将对应GPIO口配置成DCMI复用模式,并配置同步时钟,行场和像素同步,打开DCMI帧中断,配置中断优先级,值越小优先级越高。DMA配置,配置DMA通道为DCMI采集通道,配置外设地址、目标传输地址、存储器类型、增量模式、传输数据长度等参数,若采用双缓冲需配置DMA为双缓存模式,打开DMA传输完成中断,并配置中断优先级。
(2)摄像头配置时钟配置
采用外部时钟,即STM32F4的输出时钟给摄像头工作,基础时钟为12MHz,摄像头内会根据时钟寄存器配置为其工作的时钟。寄存器配置,采用i2c通讯配置摄像头寄存器使其能正常出图像。图像分辨率配置,通过修改摄像头输出画面的起始位置和结束位置,分别配置行和列的窗位置,使其能够输出目标大小的图像。
(3)PWM配置
将舵机控制口配置成PWM输出模式,并根据预分频系统和重加载值配置成20ms的PWM输出,根据舵机控制方法输出PWM进行舵机控制
2.中断处理流程
(1)DCMI行场中断采集流程
采用DMA从数据寄存器中传输数据,以word为单位(4字节)进行FIFO传递(先进先出),要求目标图像必须是RGB565格式,在DCMI中断处理函数中,每次行中断产生时改变DMA的传输地址(每次传输一行数据),在场中断中结束采集并将采集结束标志置1,在主函数中进行判断和处理。
(2)DCMI&DMA双缓存图像采集流程
采用DMA从数据寄存器中传输数据,以word为单位进行传输,采用双缓存(每个缓存设置成一行图像数据的长度,这样每次只传1行数据保证准确性)进行DMA传输,即一个缓存中数据传完,切换到另外一个缓存进行传输,形成乒乓操作。当一个缓存传输完会产生DMA中断,在DMA中断中将图像数据从这个缓存中复制到目标图像缓存(要根据DMA判断是否另外一个缓存正在使用才能复制),这样在帧中断到来时可以将整个图像全部传输到目标图像缓存中,这种方式可以采集RGB5656图像也可以直接采集灰度图(在行复制中只提取Y分量)。若数据是分块存储,则需要将数据复制到对应的缓存快中。DCMI中断处理函数当检测到DCMI中断,先关闭DCMI采集和DMA传输,进入图像显示和图像处理函数,当图像识别完成后,再打开DCMI和DMA继续进行图像采集。
3.主函数流程时钟配置
采用RCC时钟配置将系统主频配置成192MHz,具体方法是系统时钟源输入为HSE外部晶时钟12MHz,配置初始倍频器PLL为192MHz(内部计算方法是基础时钟/分频参数*倍频参数,具体需要看时钟配置过程)然后2分频给总线时钟,最后8分频给外设时钟,外设使用时会根据总线时钟分频得到自己的工作时钟。外设初始化,串口、GPIO、LCD、I2C、OV7670、TIME、DCMI、DMA初始化,初始化完成后开始图像采集。主循环,判断图像采集完成标志位,若采集完则进行图像处理,包括LCD显示、图像识别、输出信息、PID追踪等。
三、图像识别算法介绍
1.颜色识别追踪算法
(1)RGB转HSL颜色空间
本模块中采用的颜色识别在HSL(色度、饱和度、亮度),根据RGB转HSL颜色公式转换得到
(2)颜色阈值
判断在HSL颜色空间中,每种颜色有对应得颜色阈值范围,根据每种颜色的阈值范围可以判断图像中每个像素点的阈值是否满足条件颜色阈值可以输出每帧图像的中心点HSL值进行标定(或者计算区域范围的HSL值进行标定)
(3)目标位置计算
采用隔行隔列的方法加快目标位置计算,统计图像中所有满足颜色阈值的像素点坐标的和,再除以像素总数(注意是满足颜色阈值的像素点)就可以得到目标的中心点位置(X,Y)
(4)舵机PID计算
根据目标的实际中心点(X,Y)和期望的目标位置(centerX,centerY)图像中心,进行PID误差反馈计算,可以得到舵机需要输出的PWM值,这里直接采用定时器需要输出的比较值进行简化计算加快处理。
(5)控制追踪
在定时器中断中处理PWM输出值控制舵机运动,可以实时控制舵机位置进行目标追踪多目标的颜色识别可以采用同样的方法,区别只是在颜色阈值判断时增加不同名称的统计值,然后根据统计值计算不同目标的中心位置。
2.二维码识别
这里直接采用ATK的二维码识别库稍作修改,只支持英文和字符的二维码,不支持中文,不做具体原理介绍F4单板在不外扩内存的情况下可以实现240x240分辨率的二维码识别,具体方法可以查看代码中的实现过程
3.寻迹识别
(1)二值化处理
采用灰度均值或者中值进行二值化处理,处理后的图像为二值化矩阵,可以将整副图像分成几个ROI区域进行处理,一般从上到下分成3块区域,分别计算每块区域的线段位置;
(2)目标行统计
统计图像中每行所包含的白点(白线0xff)(或者黑线0x00)数目,判断行的上下边界作为目标的上下边界线
(3)目标列统计
统计图像中每列所包含的白点(白线0xff)(或者黑线0x00)数目,判断列的左右边界作为目标的左右边界线
(4)输出目标信息
采用边界对角线计算每段线段的中心位置和偏向角,根据线段位置即可计算小车前进和左右。

3.人体检测和追踪
(1)人体检测触发机制
采用红外热释电模块(GPIO设置为信号输入,检测热释电的信号触发)如果检测到高电平说明有人在设备范围内(1s钟读取一次,由于热释电模块会延时保持一段时间后关闭,导致低电平,所以只能做触发开关,不能作为人一直在设备区域内的凭据),有热释电模块(程序中置一个标志位)触发人体运动检测算法

(2)人体运动检测
采用隔帧差分的方法,每次在图像采集完成标志中计算采集的帧ID,每两帧复位一次帧ID,每次保存上一帧的图像到一个缓存中,在下一帧到来时进行帧差分(如果有环境干扰和噪声,在这次差分时已经去掉了很大一部分,因为两帧之间时间够短,可以认为环境变化不大),将差分后的图像再进行一次滤波,之后进行腐蚀膨胀腐蚀,进一步去除杂点,做完去噪之后进行二值化分割(采用OSTU自适应二值化算法,可以有效去除环境干扰和摄像头因素,之前有采用均值分割和固定阈值分割,最后发现这个效果比较好),将分割之后得到二值化矩阵

(3)人体区域检测和目标追踪
将二值化矩阵进行像素统计,超过目标像素阈值认为区域内有人体移动,则可进行移动跟踪(二值化时将白点作为人体有效目标),由于背景变化会存在一部分是背景带来的目标区域,因此下一步采用隔像素进行扫描和统计像素点区域内的白点坐标,最终可以计算出人体目标的中心点位置,根据舵机当前的位置和期望的位置(图像中心)进行PID计算,得到舵机需要移动的位置,转换成PWM值控制舵机追踪。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐