基于Openmv H7 Plus 的红色巡线+十字路口+多数字识别算法
一、串口通信
由于是采用命令集的方式控制openmv,摄像头不需要接收太多的数据,我采用的是判断串口接收的长度来区分命令集。flag为接收数据的长度,通过发送不同长度数据来改变openmv的工作模式
一、色块识别巧用
1.巡线
在openmv的开源库中有色块识别的关键函数blob(),可以传回识别出的矩形色块的中心坐标blob.cx() blob.cy()和色块宽度blob.w()及高度blob.h() ,及色块偏转角度.
在巡线过程中可以通过传回色块中心坐标和角度来判断当前的姿态是否需要矫正,可通过其他处理器中的pid矫正。
2.十字/T字识别
想必你也能猜到我要用什么来判断十字/T字路口了,那就是通过判断blob.w()即色块宽度来判断是否到达路口,当blob.w()大于一定阈值时,即可判断为十字路口。
3.数字识别
openmv的开源资料很多,其中能用于数字识别的常用的就是神经网络和模板匹配,由于我的摄像头是openmv H7 Plus ,因此选择采用神经网络的方法来作数字识别,建立出来的模型的准确率也极高,只要不是特殊刁钻的角度,均可使用。
(本来是100%的,被我改没了=-=)
4.多数字识别左右判断
图像识别处理的核心就是滤除图像噪音,排除无用的部分。我们可以先截取图像中识别到的矩形数字框,再对矩形数字框进行神经网络的数字识别。这样就排除了很多图像噪音,提高了很多准确率。
为了提高手持数字的成功率,我建立了两套的模型labels1和labels分别来对手持数字、地面数字进行识别。(labels1的数字识别是采用特殊角度进行的,建议你们采用自己建立模型)
具体代码如下
(代码是电赛期间敲的,最近也忙,备注懒得打了=-=,有的备注)
# Edge Impulse - OpenMV Image Classification Exampleimport sensor, image, time, os, tf,math
from pyb import UARTsensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((320, 240)) # Set 240x240 window.
sensor.skip_frames(time=2000) # Let the camera adjust.
threshold_index = 0 # 0 for red, 1 for green, 2 for blue# Color Tracking Thresholds (L Min, L Max, A Min, A Max, B Min, B Max)
# The below thresholds track in general red/green/blue things. You may wish to tune them...
thresholds = [(70, 4, 18, 127, -125, 127), # generic_red_thresholds(30, 100, -64, -8, -32, 32), # generic_green_thresholds(0, 30, 0, 64, -128, 0)] # generic_blue_thresholdsuart = UART(3, 115200)net = "trained.tflite"
labels = [line.rstrip('\n') for line in open("labels.txt")]
net1 = "trained1.tflite"
labels1 = [line.rstrip('\n') for line in open("labels1.txt")]
crosstime=0
clock = time.clock()
aa=[0,0,0,0,0,0]
num=10
roi=(0,0,0,0)
flag=10#4识别数字 5巡线 6匹配数字 1继续寻找 0找到数字
direct=0 #第一个数据判断左右 0直行 1左拐 2右拐
while(True):clock.tick()size = uart.any();if size != 0:command = " "command = uart.read()flag = len(str(command))size = 0print(flag)while(flag==4):#######################2初始复位识别数字img = sensor.snapshot().lens_corr(1.8)if 1:# default settings just do one detection... change them to search the image...for obj in tf.classify(net1, img, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):img.draw_rectangle(obj.rect())# This combines the labels and confidence values into a list of tuplespredictions_list = list(zip(labels1, obj.output()))for i in range(len(predictions_list)):if predictions_list[i][1]>0.95:num=i+1output_str="[%3.d,%3.d]" % (num,7)################################uart.write(output_str)########################################print(output_str)flag=5if(flag==5):sensor.set_pixformat(sensor.RGB565)img = sensor.snapshot().lens_corr(1.8)found=0for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):# These values depend on the blob not being circular - otherwise they will be shaky.if blob.elongation() > 0.5:img.draw_edges(blob.min_corners(), color=(255,0,0))img.draw_line(blob.major_axis_line(), color=(0,255,0))img.draw_line(blob.minor_axis_line(), color=(0,0,255))# These values are stable all the time.img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())# Note - the blob rotation is unique to 0-180 only.img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)#print(blob.corners())found=1 #找到红线if blob.w()<250:output_str="[%3.d,%3.d]" % (blob.cx(),1) #巡线else:output_str="[%3.d,%3.d]" % (0,4) #十字 切换至数字寻找数字#print(blob.cx(),blob.w(),blob.rotation_deg())if found==0:output_str="[%3.d,%3.d]" % (0,6) #没识别到红线则停车 保持巡线模式uart.write(output_str)#######################################################print(output_str)if(flag==6):sensor.set_pixformat(sensor.GRAYSCALE)img = sensor.snapshot().lens_corr(1.8)img1=imgfound=0output_str="[%3.d,%3.d]" % (0,5)# 下面的`threshold`应设置为足够高的值,以滤除在图像中检测到的具有# 低边缘幅度的噪声矩形。最适用与背景形成鲜明对比的矩形。#寻找第一个数字for r in img.find_rects(threshold = 10000):img.draw_rectangle(r.rect(), color = (255, 0, 0))for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))#print(r1.x(),r1.y(),r1.w(),r1.h())roi=[r.x(),r.y(),r.w(),r.h()]img1=img.copy(1,1,roi,True)#print(roi1)for obj1 in tf.classify(net, img1, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):img1.draw_rectangle(obj1.rect())# This com bines the labels and confidence values into a list of tuplespredictions_list = list(zip(labels, obj1.output()))if predictions_list[num-1][1]>0.6:found=1print(num)if r.x()+r.w()/2<140: #####左拐output_str="[%3.d,%3.d]" % (1,5)else:output_str="[%3.d,%3.d]" % (2,5)uart.write(output_str)print(output_str)
基于Openmv H7 Plus 的红色巡线+十字路口+多数字识别算法相关推荐
- 基于matlab数字识别算法系统设计与实现(含源文件)
欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 目 录 内容摘要------------------------------1 关键字----- ...
- 持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型
持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tens ...
- 基于深度学习的手写数字识别算法Python实现
摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...
- m基于CNN卷积网络和GEI步态能量图的步态识别算法MATLAB仿真,测试样本采用现实拍摄的场景进行测试,带GUI界面
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 目前关于步态识别算法研究主要有两种:基于模型的方法和非基于模型的方法.基于模型的步态识别方法优点在于 ...
- AI常用框架和工具丨11. 基于TensorFlow(Keras)+Flask部署MNIST手写数字识别至本地web
代码实例,基于TensorFlow+Flask部署MNIST手写数字识别至本地web,希望对您有所帮助. 文章目录 环境说明 文件结构 模型训练 本地web创建 实现效果 环境说明 操作系统:Wind ...
- 【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】
⛄一.手写数字识别技术简介 1 案例背景 手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性.由于手写体数字的随意性很大,如笔画粗细.字体大小. ...
- python基于轻量级CNN模型开发构建手写藏文数字识别系统
最近做的很多工作都是跟手写性质的数据集有关的,比如:手写汉字.手写甲骨文.手写数字.手写字母等等,今天主要做的实践是对藏文中的手写数字进行识别分析,在我之前的博文中有很多相关的实践分析,感兴趣的话可以 ...
- 基于Numpy构建全连接前馈神经网络进行手写数字识别
文章目录 (一) 问题描述 (二) 设计简要描述 (三) 程序清单 (四) 结果分析 (五) 调试报告 (六) 实验小结 (一) 问题描述 不使用任何机器学习框架,仅仅通过Numpy库构建一个最简单的 ...
- m基于CNN卷积神经网络和GEI步态能量图的步态识别算法MATLAB仿真
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 步态识别是一种新兴的生物特征识别技术,旨在通过人们走路的姿态进行身份识别,与其他的生物识别技术相比, ...
最新文章
- PTA混淆总结(就做个笔记储存一下)
- MyEclipse 导出 javadoc 乱码解决
- map、mapPartitions、mapPartitionsWithIndex区别在哪里?
- 蔬菜名称大全500种_96种室内盆栽植物图片及名称,室内植物品种大全
- ASP.NET缓存 Cache
- 基础 - 常见字符的ASCII码
- 【TDA4系列】向 PSDKRA 添加新的图像传感器
- IE6 PNG 透明
- ubantu 安装anaconad_Ubuntu16.04安装Anaconda (转)
- 论PMP和PRINCE2的价值?
- 修改window本地hosts文件,修改域名指向
- 如何在IGV上使用BLAT搜索非模式物种
- 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667B
- 任意斜率的中点画线算法
- 有趣好玩实用的网站 保证闻所未闻
- 使用KlipC避开平台扫止损,控制止盈和延迟订单成交
- excel将B列数据放在A列后面
- 如何从脚本小子变成黑客大神?【网络安全】
- 三种方法 彻底解决win10 cmd下运行python弹出windows应用商店
- PL/SQL编程-存储过程