位置: IT常识 - 正文

2021电赛F题视觉教程+代码免费开源(电赛2021题目)

编辑:rootadmin
2021电赛F题视觉教程+代码免费开源 2021电赛F题视觉教程+代码免费开源

推荐整理分享2021电赛F题视觉教程+代码免费开源(电赛2021题目),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:电赛2020c题,电赛往年题,电赛2021题目,电赛往年题,2020电赛f题,电赛 视觉,电赛2021题目,2020电赛f题,内容如对您有帮助,希望把文章链接给更多的朋友!

最近好多要电赛题的源码,其他csdn营销号下载都需要会员或钱,正好最近课设又要做一遍电赛小车题,哥们先把代码开源了,饿死营销号

电赛宝藏链接:

四天三夜,那布满着未知与紧迫感的气息让荷尔蒙无比兴奋,挑战着脑力与体力的极限! 2021全国大学生电子设计竞赛F题参赛简记

2021年小车题完整代码及教程! 2021电赛F题视觉教程+代码免费开源

其他年份的经典题目的源码都在这里啦! 【电赛源码合集】19电磁炮.zip、17板球.zip、15风力摆.zip、13倒立摆.zip、全国大学生电子设计竞赛历年真题(1994-2021).zip

参加电赛必看的经验贴! 全国电子设计竞赛指导 (老学长挥泪经验之谈)

论文模板及评分标准! 全国大学生电子设计竞赛论文写作模板及评分标准

正文开始咯: 视觉的一个任务是视觉上位机模块识别数字并进行滤波和判断处理,传指令给下位机;另一个任务是红线循迹。

不多bb,先上代码和效果图~

链接:GitHub——2021电赛F题所有程序

链接:GitHub——K210数字识别模型文件及主程序

链接:GitHub——openmv循迹主程序分享

链接:百度网盘——小车主板pcb文件 提取码:3n50 –来自百度网盘超级会员V3的分享

README:蓝牙连接后,发送字符 " t " 给小车进入测试程序

K210数字识别效果:(我媛哥的手真好看)

openmv红线循迹效果:

小车整体图:

硬件工具:K210、openmv

软件工具:Maixpy IDE、OpenMV IDE

IDE可到官网下载:

https://www.sipeed.com/index.html

https://singtown.com/openmv/

文章目录2021电赛F题视觉教程+代码免费开源1. K210数字识别、滤噪、判断1.1 功能难点及对应函数实现分析1.2 YOLOV5神经网络模型训练1.3 K210操作步骤1.3.1 下载K210的IDE1.3.2 烧入最新固件库1.3.3 将文件放入TF卡中1.3.4 IED中查看效果1.3.5 通过串口调试助手测试指令通信1.4 上代码含详细注释2. OPENMV红线循迹1. K210数字识别、滤噪、判断

正常操作是上位机是识别,给下位机传数据,处理放到下位机;假如你有个坑比队友,处理还是放上位机干吧;

经过算法优化,现在几乎不存在掉帧。

1.1 功能难点及对应函数实现分析

1、在小车行驶过程中,会存在数字不能完全进入视野中情况等存在有很多帧误识情况,要进行滤噪处理

2、每一帧要做处理的同时每个目标值的矩形框进行处理,每个目标值的矩形框还要进行滤波

3、在上位机上不断的优化算法,减少掉帧

4、在Maixpy IDE中python 的numpy、pandas巴拉巴拉包都调不了

5、图中最多出现四个,但这里设了读六个矩形框,留两个容错,不然有误识别的直接死机

6、给下位机传送指令:

一开始初始化识别传送对应的数字

若为12,则后面不在传送指令

若为34,则后面路口处传"l"or"r"

2021电赛F题视觉教程+代码免费开源(电赛2021题目)

若为5678,则后面两个路口传送两次"l"or“r”

7、设计思路

通过初始化函数识别一开始给入的数字并保存下来;

根据识别的情况进入不同的程序;

12号病房,识别完了以后是不用在路上在识别的,直接关掉程序;

34号病房,初始化识别完了,加两秒延迟,避免在开始的时候连续识别传指令,要在路上识别一次,要保证返回来的时候不识别不然又给下位机传指令了,还要保证初始化识别完了以后不会紧接着识别误认为是路上的标签给下位机传指令;

5678也一样,但是路上得识别两次穿两次指令;

1.2 YOLOV5神经网络模型训练

训练集:

测试集:

训练输出结果:

将通过拍摄3403张赛道数字照片,使用labellmg进行标签标定,制作数据集,yolov5训练 (哥们和队友从晚上十点标到凌晨两点(哭脸))

详细过程可看下面文章:

YOLOV5:数据集制作

YOLOV5:不懂代码也能使用YOLOV5跑项目

注意:这里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

更新固件库:

1.3.3 将文件放入TF卡中

文件目录:

将上述文件全复制到tf卡中,tf卡插入k210

注意:tf卡先格式成FAT32格式,部分牌子的tf卡格式了也不能挂载到k210上,建议多换几张卡试试

1.3.4 IED中查看效果

IDE中运行效果:

1.3.5 通过串口调试助手测试指令通信

引脚9是TX,引脚10是RX,波特率为115200

通过usb转ttl连接到电脑上

初始识别数字为6,两次转向是向左

1.4 上代码含详细注释

第一版本:

import sensor,image,lcd,timeimport KPU as kpufrom machine import UARTfrom fpioa_manager import fmlcd.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] >= 10): intnum = 7 uart_A.write('7') #print(7) TF = 0 if(List_score01[7] >= 10): intnum = 8 uart_A.write('8') print(8) TF = 0 else: a = lcd.display(img) return intnum#34道路识别函数def threefour(intnum): #设置二维矩阵,存放每一个矩形框中不同数字识别的次数 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 TF = 1 while(TF): #加载一帧图像 img = sensor.snapshot() code = kpu.run_yolo2(task, img) if code: int_i = 0 for i in code: int_i +=1 a=img.draw_rectangle(i.rect()) a = lcd. display(img) list1=list(i.rect()) b=(list1[0]+list1[2])/2 #对应的矩阵值加一 List_score02[int_i][int(classes[i.classid()])-1] += 1 print(List_score02[int_i]) #该目标框逐个数字分析是否出现次数到达10,即为该目标区域中的数字 for ii in range(8): if(List_score02[int_i][ii] >= 10): intnum02[int_i] = ii+1 #该目标区域中的数字是否是初始化识别的数字 if(intnum == intnum02[int_i]): #判断位置,从而判断先做向右转 if(b < 75): uart_A.write("l") print("l") TF = 0 if(b > 75): uart_A.write("r") print("r") TF = 0 else: a = lcd.display(img) return 0#5678道路识别函数def fivesixseveneight(intnum): #设置二维矩阵,存放每一个矩形框中不同数字识别的次数,一帧中最多有四个目标区域,但这里设置六个,防止有误识别的造成有很多矩形框程序暴死 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 TF = 2 #5678道路识别要识别两次,传两次指令,两次直接通过延时函数断开 while(TF): img = sensor.snapshot() code = kpu.run_yolo2(task, img) if code: int_i = 0 for i in code: int_i +=1 a=img.draw_rectangle(i.rect()) a = lcd. display(img) list1=list(i.rect()) b=(list1[0]+list1[2])/2 List_score02[int_i][int(classes[i.classid()]) -1] += 1 print(List_score02[int_i]) for ii in range(8): if(List_score02[int_i][ii] >= 10): intnum02[int_i] = ii+1 if(intnum == intnum02[int_i]): if(b < 75): uart_A.write("l") print("l") TF -= 1 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 time.sleep(3) if(b > 75): uart_A.write("r") print("r") TF -= 1 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 time.sleep(3) else: a = lcd.display(img) return 0#执行程序intnum = begin(intnum)time.sleep(3)if(intnum == 3 or intnum == 4): threefour(intnum)if(intnum == 5 or intnum == 6 or intnum ==7 or intnum == 8): fivesixseveneight(intnum)uart_A.deinit()del uart_Aa = kpu.deinit(task)

第二版本:

import sensor,image,lcd,timeimport KPU as kpufrom machine import UARTfrom fpioa_manager import fmlcd.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, 9600, 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('A') print(1) #退出初始化循环 TF = 0 if(List_score01[1] >= 10): intnum = 2 uart_A.write('B') print(2) TF = 0 if(List_score01[2] >= 10): intnum = 3 uart_A.write('C') print(3) TF = 0 if(List_score01[3] >= 10): intnum = 4 uart_A.write('D') print(4) TF = 0 if(List_score01[4] >= 10): intnum = 5 uart_A.write('E') print(5) TF = 0 if(List_score01[5] >= 10): intnum = 6 uart_A.write('F') print(6) TF = 0 if(List_score01[6] >= 10): intnum = 7 uart_A.write('G') #print(7) TF = 0 if(List_score01[7] >= 10): intnum = 8 uart_A.write('H') print(8) TF = 0 else: a = lcd.display(img) return intnum#道路识别函数def then(intnum): while(1): #设置二维矩阵,存放每一个矩形框中不同数字识别的次数,一帧中最多有四个目标区域,但这里设置六个,防止有误识别的造成有很多矩形框程序暴死 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 TF = 1 while(TF): img = sensor.snapshot() code = kpu.run_yolo2(task, img) if code: int_i = -1 for i in code: int_i +=1 a=img.draw_rectangle(i.rect()) a = lcd. display(img) list1=list(i.rect()) b=(list1[0]+list1[2])/2 List_score02[int_i][int(classes[i.classid()]) -1] += 1 #print(int_i) print(str(List_score02[int_i]) + str(int_i)) for ii in range(8): #int_i是第几个框,ii是第几个框中的每个数字 if(List_score02[int_i][ii] == 10 and intnum == ii+1): if(b < 75): uart_A.write("L") print("L") TF = 0 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 if(b > 75): uart_A.write("R") print("R") TF = 0 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 else: a = lcd.display(img) TF = 0 List_score02 = [[0]*8] * 6 intnum02 = [0]*6 return 0#执行程序time.sleep(3)uart_A.write("E")intnum = begin(intnum)time.sleep(3)then(intnum)uart_A.deinit()del uart_Aa = kpu.deinit(task)2. OPENMV红线循迹

openmv就是玩具 ——某位老哥(收录名人名言)

用openmv红线循迹,这部分比较简单,就不多说了吧

循迹测试:

测试结果:

虽然2021电赛过去了,但是现在回味起来依然很香~

本文链接地址:https://www.jiuchutong.com/zhishi/300201.html 转载请保留说明!

上一篇:【ChatGPT】ChatGPT-5 强到什么地步?(chat p)

下一篇:【js】超详细js函数基础()

  • 小米watch color2怎么打电话(小米watch color2怎么重置)

    小米watch color2怎么打电话(小米watch color2怎么重置)

  • 华为p40都是5g版本手机吗(华为p40系列都是5g吗)

    华为p40都是5g版本手机吗(华为p40系列都是5g吗)

  • 华为手机打不开rar压缩文件(华为手机打不开google play商店)

    华为手机打不开rar压缩文件(华为手机打不开google play商店)

  • ipad怎么插卡上网(怎么给ipad插卡)

    ipad怎么插卡上网(怎么给ipad插卡)

  • 买二手相机要注意什么(买二手相机要注意什么闲鱼)

    买二手相机要注意什么(买二手相机要注意什么闲鱼)

  • 功放ab两组输出有什么用(功放ab两组输出 2对音箱的区别)

    功放ab两组输出有什么用(功放ab两组输出 2对音箱的区别)

  • 怎么找回自己建的微信群(怎么找回自己建的微信群聊不保全通讯录的)

    怎么找回自己建的微信群(怎么找回自己建的微信群聊不保全通讯录的)

  • 苹果11莫名其妙发热(苹果11莫名其妙的卡屏)

    苹果11莫名其妙发热(苹果11莫名其妙的卡屏)

  • 两个系统怎么样选择启动(两个系统的电脑)

    两个系统怎么样选择启动(两个系统的电脑)

  • ios14不支持6s(ios14不支持无线充电)

    ios14不支持6s(ios14不支持无线充电)

  • 手机跳屏是内屏坏了吗(手机跳屏是内屏吗)

    手机跳屏是内屏坏了吗(手机跳屏是内屏吗)

  • 手机充电没有闪电标志(手机充电没有闪充标志)

    手机充电没有闪电标志(手机充电没有闪充标志)

  • qq语音通话人数上限(qq语音通话人数上限15人)

    qq语音通话人数上限(qq语音通话人数上限15人)

  • 注销apple id账号(注销apple id账号后,微信还能用吗)

    注销apple id账号(注销apple id账号后,微信还能用吗)

  • typec数据线是什么(typec数据线什么牌子质量好)

    typec数据线是什么(typec数据线什么牌子质量好)

  • 抖音举报别人会显示不(抖音举报别人会通知对方吗)

    抖音举报别人会显示不(抖音举报别人会通知对方吗)

  • 苹果x信号塔图标是什么(苹果x信号一格怎么回事)

    苹果x信号塔图标是什么(苹果x信号一格怎么回事)

  • 小米mix2s支持30瓦快充吗(小米mix2s支持无线充电吗)

    小米mix2s支持30瓦快充吗(小米mix2s支持无线充电吗)

  • 新版vue怎么设置时间(vue怎么设置中文版本)

    新版vue怎么设置时间(vue怎么设置中文版本)

  • 华为tl00是什么型号(华为tit tl00什么型号)

    华为tl00是什么型号(华为tit tl00什么型号)

  • 苹果xr跟8p机身大小(苹果xr和8p重量差多少)

    苹果xr跟8p机身大小(苹果xr和8p重量差多少)

  • 华为浏览器怎么卸载(华为浏览器怎么设置兼容模式)

    华为浏览器怎么卸载(华为浏览器怎么设置兼容模式)

  • oppofx充电器多少瓦(oppo充电器是多少安的)

    oppofx充电器多少瓦(oppo充电器是多少安的)

  • 移动全网通什么意思(移动全网通手机)

    移动全网通什么意思(移动全网通手机)

  • 微店在微信点亮看不到(微店微信点亮功能2020)

    微店在微信点亮看不到(微店微信点亮功能2020)

  • MAC OS X10.12.3正式版怎么样  OS X10.12.3正式版更新内容详细介绍(mac os x 10.0)

    MAC OS X10.12.3正式版怎么样 OS X10.12.3正式版更新内容详细介绍(mac os x 10.0)

  • CSS3煎制荷包蛋动画特效,优质男士表白必备(如何写煎荷包蛋过程)

    CSS3煎制荷包蛋动画特效,优质男士表白必备(如何写煎荷包蛋过程)

  • 进项税认证后转出
  • 待解预算收入税务局退税如何做账
  • 员工借款业务流程
  • 财务报表申报错误怎么办
  • 技术服务费3%
  • 企业违约金收入会计分录
  • 手撕票几个点
  • 部分红冲的发票,剩余未冲红部分可以再红冲么
  • 开具银行资信证明
  • 土地使用权评估原则
  • 公司账外现金
  • 准予扣除的职工福利费
  • 过路费普通发票可以抵税吗
  • 出口退税销项大于进项,需要交税吗
  • 人力资源服务费税收编码
  • 何为独立核算
  • 无偿受让股权的股东对发起股东没有出资承担责任
  • 贸易公司一般纳税多少
  • 对外支付类型
  • 借款支付工程款合法吗
  • 付下一年房租会计分录
  • 购进免税农产品怎么计算进项税额
  • 如何关闭edge浏览器下载保护
  • win11windows键没反应
  • 怎样提高网速呢知乎
  • rtc resume
  • linux shell 比较运算符
  • 公司费用报销包括哪些
  • 怎么配置tomcat服务器
  • vue3.0安装
  • Thinkphp 中 distinct 的用法解析
  • 微信小程序游戏手游排行榜
  • php目录结构
  • javascript数据类型分为哪两类
  • 运杂费可以计入固定资产吗
  • 银行账户维护费怎么做账
  • 如何扣除企业接单费用
  • 不认定为一般纳税人的有哪些
  • 新公司开账户需要多少钱
  • 企业注销需要清产核资吗
  • 股权转让需要开票吗怎么开
  • 小型微利企业所得税按什么预缴
  • sql语句修改某个字段
  • Windows下MySQL 5.6安装及配置详细图解(大图版)
  • 房产租赁增值税率是5%还是9%
  • 季度所得税申报表本年累计怎么填
  • 餐饮毛利率多少为合理范围
  • 跨年发票分录
  • 合并设立是什么意思
  • 出口货物预收账款分录
  • 核定征收无收入
  • 增值税运费发票清单怎么开
  • 企业改制后如何脱离原主管部门
  • sql server连接不上服务器怎么办
  • 连接mysql数据的四要素
  • 如何强制退出当前程序mac
  • bois开启usb功能
  • 怎么操作win10系统
  • linux批量替换文件夹名称
  • 如何把鼠标指针换成笔的形状
  • Windows RT 8.1 Update 3九月发布 届时将加入改进版锁屏
  • windows8使用技巧
  • 文件视图分为哪几种
  • linux系统安装程序
  • opengll
  • 塔防类的网游
  • fedora vlc
  • 查询某个时间段
  • document对象常用方法
  • javascript产生随机整数随机性强
  • jquery图片放大效果
  • window运行怎么打开
  • 爬虫如何识别验证码
  • jq动态设置css
  • jquery设置div的宽度和高度
  • 广州税务局前局长是谁
  • 期初库存和期末库存是什么意思
  • 工商税务登记流程视频
  • 怎么删除天眼查诉讼信息
  • 海南省税务局网站
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设