梦飞openmv py-AI机器视觉_自主开发openmv底层固件和硬件
1.openmv是什么?
openmv是国外团队开发的基于STM32的一款机器视觉模块,openmv是一个开源项目,所有的代码和硬件均以MIT协议开源,它可以利用micropython进行上层应用代码的开发,旨在像arduino一样简单编程就能实现各种图像识别的功能,虽然STM32不是专用图像视频处理器,但是其作为一款MCU表现的超强的图像处理性能仍然可以做很多事情。在此感谢中国团队星瞳科技对openmv的推广、使用方法和使用技巧做出了巨大的贡献;
2.为什么要自主开发openmv?
首先,想开发一款openmv的初衷是它太好玩了,最开始也买了好几个模块去玩,后来了解一些硬件构造成本和原理后觉得这个价格实在受不了,一个简单的硬件电路板和各种配件是普通学生玩不起的,这阻挡了非常多热爱学习又资金有限的玩家;
其次,最新的openmv源码在图像识别的算法上基本没有太多有用的更新,除了当初的颜色(连通域算法)/形状(霍夫变换)/二维码(zbar)/人脸(haar_casecade)/模板匹配(CNN)/二值化分割(canny算子)/线性回归/HOG特征/keypoints跟踪/标签识别等等常用的图像分割和识别算法,后来增加的machine learning和深度学习框架基本没有实际应用价值(3层神经网络,帧率4-5帧,只能演示用一下);
最后,为什么不在传统机器视觉的应用上再上前一步呢?其实所有的深度学习,前处理和后处理都离不开传统算法,甚至有时我们需要使用传统算法和AI结合才能完成一个复杂的应用。我们希望能做出一款能学习也能实际应用的产品,而不是仅仅是所谓的正版商家盈利的手段(根据MIT 开源协议,openmv没有正版之说,购买key只是个IDE验证和向openmv团队的捐赠)。
3.梦飞oepnmv做了哪些?
(1)基于STM32F407的openmv
梦飞小梦在STM32F407上实现了openmv的程序支持,官方源码中已不再支持openmv1代,但是其实openmv2代的性能(STM32F427)除了内存多几十KB之外,其他硬件资源和STM32F407并无区别,并且F407也支持CCM快速内存和DCMI接口,于是将F407的硬件资源分配按照openmv2的资源分配重新编写一个omvboadrconfig.h头文件和更改了bootload中的boot地址分配,以及支持了内部FLASH映射成U盘的操作,并开放了模板匹配和光流的算法,使其在QQVGA分辨率下支持大部分传统视觉算法,在STM32F407VGT6上实现了openmv的固件;代码功能可以相当于openmv3,为此,我也整理了关于openmv源码下载,Linux环境安装,源码编译,各部分分解,代码流程等文档。
(2)基于STM32H7的openmv4
在STM32F4上尽管实现了openmv,但是其处理性能和分辨率限制还是大大降低了可玩性,因此我又在高性价比的STM32H750上做文章,由于STM32H750VBT6具备实际使用2MB的FLASH和1MB的存储,硬件资源上和H743一致,唯一的区别就是H750的功耗比H743高,发热量也大一点,但是并不影响它出色的处理性能和高性价比;于是,利用开源的STM32H7_openmv代码,在其上面进行二次开发;并制作了配套的openmv硬件,
支持OV7670摄像头接口(2.54排插接口,支持ov7670/7725/2640/5640等)
8MB_QSPI_FLASH,2路5V舵机驱动接口,两路串口,4路单独的PWM输出可控制电机,8ping SPI LCD接口,SD卡,SW下载口,并且可以通过IO口复用配置成各种功能;
硬件上最大的特点就是:使用起来无需任何转接板,也无需SD卡外置了flash,能直接保存大量的py代码
基于openmv源码的应用开发具体完成以下一些内容(后续会逐步将这些应用开发开源出来):
1)支持OV7670的驱动(期间查看了一份Linux的ov7670摄像头驱动),将其分辨率从VGA,CIF,QVGA,QCIF的全部分辨率下窗口设置函数全部支持(标准帧率24M时钟配置下QQVGA/VGA 15FPS,CIF/QCIF30FPS),有些ov7670可以支持倍频48MHz,灰度图像可以达到60fps;相比于OV7725价格低太多,并且作为图像识别的帧率也够(一般openmv的图像识别帧率不会超过30帧);
2)支持了ST7735的驱动,ST7735是一个通用的TFT液晶屏,将STM32上面的液晶屏配置代码和横屏纵屏设置加入openmv源码,可以支持通用的8pin接口ST7735液晶屏,而不用购买openmv官方接口的液晶屏
3)移植了cubeAI的mnist手写数字识别
利用openmv源码中提供的mnist手写字体识别神经网络算法,在STM32_CUBE AI中配置和生成了STM32运行代码,移植到openmv中,添加cubeai的编译器,编译成功后可在openmv中使用mnist手写数字识别的算法(其实cubeai相比tenserflow、caffe等框架更容易实现神经网络,并且支持的是ARM-cortex-M4/M7底层架构,ST官网中有现成的转换工具,因此一些简单的深度学习使用CUBE_AI是一个不错的选择)
4)openmv例程整理
尽管IDE上自带了很多例程,但是在实际应用的时候,可能还需要外接传感器和设备,因此我整理了众多的openmv例程,包括ST7735/ST7789 py代码驱动、OV5640自动聚焦、形状识别(圆/矩形/三角形)、颜色识别追踪、人脸识别追踪、超声波测距、图像定高测距(乒乒球测距)、车牌识别(模板匹配)、人脸比对(LBP特征)、光流/视觉定位、板球系统、电磁炮系统、红外热成像测温等等众多openmv例程
5)openmv视觉小车
我们在openmv上开发了一套智能履带小车,采用L298N驱动和金属底盘安装的履带车,并搭配SG90/MG90S云台,可以实现云台自动追踪和小车前后左右同时跟踪,大大增加了其可玩性,并且整套售价达到了官板的1/3,这也算是一个巨大的进步了 ;
6)openmv机械臂
梦飞智能基于自主开发的openmv,制作了基于openmv的三自由度机械臂,并能通过机械臂进行目标识别和抓取操作
7)openmv WiFi图传模块
梦飞openmv还配套制作了WiFi图传模块,基于ESP12 arduino开发,将图像通过SPI接收,然后用webserver发送出去,可以在手机上显示,VGA最快能做到10fps,QVGA能到18fps,QQVGA-25fps,基本上达到了实时的效果,比AT-WINC1500快了不知道多少倍,由于ESP8266的低功耗,整体模块功耗为5V-0.25A。
8)openmv LCD模块
基于ST7735 LCD液晶屏,使用通用的8pin -LCD可接入openmv,并调用openmv底层的函数,可以支持RGB显示和灰度图显示
9)openmv 摄像头转接板
基于梦飞openmv的设计,可以支持不同ov系列的摄像头,因此制作了24pin dvp转2.54接口的摄像头转接板,可以把OV7670/7725/2640/5640/3640等等dvp摄像头转接后接入openmv
10)openmv双轴云台
尽管有开源的3D打印云台,但是精度问题和转接板问题,使用太麻烦,于是基于航模的fpv两轴云台进行打孔和改造,使用SG90/MG90s舵机安装后能直接插在openmv,实现颜色,二维码,人脸追踪等玩法
4.我们还可以做些什么?
1)底层资源优化
其实STM32H7的处理性能远不止于此,因为openmv底层使用的是内部SRAM作为算法运行内存空间,如果将重要的处理算法放在TCM快速内存中运行将提升一倍的处理性能;
2)算法应用
基于现有的机器视觉算法,我们还可以实现很多应用功能
车牌识别(车牌定位、二值化分割、字符分割、畸变矫正、字符匹配等),H7的性能完全足够处理车牌识别的算法,尽管处理分辨率不会很大,可以应用于路边智能停车;
人体检测(图像二值化分割、腐蚀、膨胀、边缘提取、目标矩形框检测、矩形框筛选),基于视觉分割提取人体目标位置;采用MLX90640红外图像基于温度信息的图像将会对人体检测的准确率大大提升,可应用与智能家居,体温检测,防火防灾领域;
车道线提取(图像滤波,canny算子二值化,霍夫变换,线段提取,ROI区域选择,输出车道线位置),可应用于自动驾驶控制;
工业缺陷检测(利用图像分割算法进行缺陷提取和定位等算法)。。。等等,其实还可以做很多实际应用;
最后,,,,,,上一张图,openmv技术交流群,718304823,加群请备注从哪里获取的群号哦
梦飞openmv视觉小车(咸鱼或淘宝搜索,梦飞openmv或梦飞智能,进我的主页查看)