# 2021电赛F题视觉分析+代码免费开源
> 最近好多小宝宝们要电赛题的源码,其他csdn营销号下载都需要会员或者钱,哥们先把视觉分析+代码开源,饿死营销号
视觉的一个任务是视觉上位机模块识别数字并进行滤波和判断处理,传指令给下位机;另一个任务是红线循迹。
不多bb,先上效果图:
K210数字识别效果:
![k210结果2](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/k210%E7%BB%93%E6%9E%9C2.png)
(我媛哥的手真好看)
openmv红线循迹效果:
![openmv结果1](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/openmv%E7%BB%93%E6%9E%9C1.png)
硬件工具:K210、openmv
软件工具:Maixpy IDE、OpenMV IDE
IDE可到官网下载:
https://www.sipeed.com/index.html
https://singtown.com/openmv/
![IDE](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/IDE.png)
## 1、K210数字识别、滤噪、判断
正常操作是上位机是识别,给下位机传数据,处理放到下位机;假如你有个坑比队友,处理还是放上位机干吧;
经过算法优化,现在几乎不存在掉帧。
### 1.1 功能难点及对应函数实现分析
1、在小车行驶过程中,会存在数字不能完全进入视野中情况等存在有很多帧误识情况,要进行滤波处理
2、每一帧要做处理的同时每个目标值的矩形框进行处理,每个目标值的矩形框还要进行滤波
3、在上位机上不断的优化算法,减少掉帧
4、在Maixpy IDE中python 的numpy、pandas巴拉巴拉包都调不了
5、图中最多出现四个,但这里设了读六个矩形框,留两个容错,不然有误识别的直接死机
6、给下位机传送指令:
一开始初始化识别传送对应的数字
若为12,则后面不在传送指令
若为34,则后面路口处传"l"or"r"
若为5678,则后面两个路口传送两次"l"or“r”
7、设计思路
通过初始化函数识别一开始给入的数字并保存下来;
根据识别的情况进入不同的程序;
12号病房,识别完了以后是不用在路上在识别的,直接关掉程序;
34号病房,初始化识别完了,加两秒延迟,避免在开始的时候连续识别传指令,要在路上识别一次,要保证返回来的时候不识别不然又给32传指令了,还要保证初始化识别完了以后不会紧接着识别误认为是路上的标签给32传指令;
5678也一样,但是路上得识别两次穿两次指令;
### 1.2 YOLOV5神经网络模型训练
训练集:
![数据集1](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/%E6%95%B0%E6%8D%AE%E9%9B%861.png)
测试集:
![数据集2](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/%E6%95%B0%E6%8D%AE%E9%9B%862.png)
训练输出结果:
![输出结果](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C.png)
将通过拍摄3403张赛道数字照片,使用labellmg进行标签标定,制作数据集,yolov5训练
详细过程可看下面文章:
https://blog.csdn.net/zhaohaobingniu/article/details/120397185?spm=1001.2014.3001.5502
https://blog.csdn.net/zhaohaobingniu/article/details/120255571?spm=1001.2014.3001.5502
注意:这里yolov5得到的是.pt文件,需要进行模型转换,转化成可以加载在K210板上的.kmodel模型(后面细讲)
### 1.3 K210操作步骤
#### 1.3.1 下载K210的IDE
https://www.sipeed.com/index.html
#### 1.3.2 烧入最新固件库
官方教程:
https://wiki.sipeed.com/soft/maixpy/zh/get_started/upgrade_maixpy_firmware.html
更新固件库:
![固件库](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/%E5%9B%BA%E4%BB%B6%E5%BA%93.png)
#### 1.3.3 将文件放入TF卡中
文件目录:
![文件目录](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95.png)
将上述文件全复制到tf卡中,tf卡插入k210
注意:tf卡先格式成FAT32格式,部分牌子的tf卡格式了也不能挂载到k210上,建议多换几张卡试试
#### 1.3.4 IED中查看效果
IDE中运行效果:
![ide效果图](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/ide%E6%95%88%E6%9E%9C%E5%9B%BE.png)
#### 1.3.5 通过串口调试助手测试指令通信
引脚9是TX,引脚10是RX,波特率为115200
通过usb转ttl连接到电脑上
初始识别数字为6,两次转向是向左
![串口发送数据图](https://github.com/zhaohaobingSUI/ZHB_project_diansai/blob/master/images/%E4%B8%B2%E5%8F%A3%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE%E5%9B%BE.png)
### 1.4 上代码含详细注释
第一版:
```python
import sensor,image,lcd,time
import KPU as kpu
from machine import UART
from fpioa_manager import fm
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
sensor.run(1)
#加载yolov5模型
task = kpu.load("/sd/yolov5.kmodel")
f=open("anchors.txt","r")
anchor_txt=f.read()
L=[]
for i in anchor_txt.split(","):
L.append(float(i))
anchor=tuple(L)
f.close()
f=open("lable.txt","r")
lable_txt=f.read()
lable = lable_txt.split(",")
f.close()
#设置RX、RT引脚
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)
#设置串口通信
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
anchor = (0.1766, 0.1793, 0.4409, 0.3797, 0.6773, 0.5954, 1.0218, 0.9527, 2.158, 1.6841)
sensor.set_windowing((224, 224))
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
classes=["9","1","4","2","3","8","5","6","7" ]
#全局变量,保存初始化识别的数字
intnum = 0
#初始化识别函数
def begin(intnum):
TF = 1
#得分序列,放1-8识别的次数,每一帧识别成哪个,对应的位置加一,1-8哪个先到10即最终识别为哪个
List_score01 = [0]*8
while(TF):
img = sensor.snapshot()
#code是yolov5返回的每个矩形框的参数
#例图中出现两个目标区域的时候:[{"x":9, "y":99, "w":55, "h":82, "value":0.697979, "classid":8, "index":0, "objnum":2}, {"x":137, "y":105, "w":56, "h":67, "value":0.939132, "classid":4, "index":1, "objnum":2}]
code = kpu.run_yolo2(task, img)
#print(code)
if code:
for i in code:
#画目标区域矩形框
a = img.draw_rectangle(i.rect())
a = lcd. display(img)
list1=list(i.rect())
#print(classes[i.classid()])
#识别到的加1
List_score01[int(classes[i.classid()])-1] += 1
#print(List_score01)
if(List_score01[0] >= 10):
intnum = 1
#给下位机通信传指令
uart_A.write('1')
#print(1)
#退出初始化循环
TF = 0
if(List_score01[1] >= 10):
intnum = 2
uart_A.write('2')
#print(2)
TF = 0
if(List_score01[2] >= 10):
intnum = 3
uart_A.write('3')
#print(3)
TF = 0
if(List_score01[3] >= 10):
intnum = 4
uart_A.write('4')
#print(4)
TF = 0
if(List_score01[4] >= 10):
intnum = 5
uart_A.write('5')
#print(5)
TF = 0
if(List_score01[5] >= 10):
intnum = 6
uart_A.write('6')
#print(6)
TF = 0
if(List_score01[6] >
![avatar](https://profile-avatar.csdnimg.cn/898107cf3676476d90c7c77e8df372be_qq_38140936.jpg!1)
王二空间
- 粉丝: 7760
- 资源: 2114
最新资源
- 基于Vue、JavaScript和HTML的智慧工地Demo设计源码
- 基于JavaScript的能源故障采集系统设计源码
- 基于Unity 2020.3.14的自制KaraLyric卡拉OK字幕制作软件源码
- 基于Java语言的题库管理系统设计源码
- Python字符串替换技术详解及其实现
- 基于Vue和TypeScript的专家系统前端开发设计源码
- Python 文件操作与文本处理的最佳实践指南和技术要点详解
- Python编程领域中关于函数定义与使用的基础教学及实例解析
- 基于HTML、CSS、JavaScript等技术的中餐学院设计源码
- Python 编程语言基础要素详解 - 位运算符、循环控制、基本数据类型及字符串处理技术
- 基于editor的改进版Markdown编辑器设计源码
- Python基础教程之条件控制与进制转换应用实例讲解
- Python 编程入门指南:掌握核心语法要素及基础概念
- 基于C语言的校内赛专用编程设计源码
- 基于JavaScript的HTML/CSS水果前端设计源码
- 基于Vue框架的SoybeanTradingSystem设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)