2021电赛F题之openmv巡线(附代码)

简介: 2021电赛F题之openmv巡线(附代码)

效果展示:

出错解决方法

openmv数字识别源代码–gitee

最新的巡线代码已经编写完毕,并且拥有stm32端的代码。你可以通过给我的Github项目点赞来免费的向我获取代码。联系我的时候请附带备注以及点赞的截图,谢谢啦

Github项目地址

通过使用不同阈值的方法可以得到当前区域中什么区域有红线,对于电控而言作用类似于红外对管,之后电控通过逻辑判断如何运动,这就是我们队伍目前的思想。最后会不会用上还不确定。

同时,如果你的题目是白底黑线,那么建议使用二值化的方法。

这种方法对于只有黑白两色的识别精度会更高。

当然你也可以直接修改成黑色阈值,这个需要自己去调整

如果对代码有不了解,可以点击上方的gitee连接来向我询问

代码大致思路为选出五个roi区域,然后进行二值化或者阈值设定,将某种颜色的设定为1,另外的颜色设置为0,那么当openmv识别到的是特定的颜色的时候,就会返回1,这就类似于红外对管,红外对管遇到黑线和白线也会返回不同的值,这就是本套代码的思路。

之后通过位移运算以及串口便可以发送对应的框中此时的数值了,从而起到红外对管的作用。

如果对你有帮助就点个赞吧

import pyb, sensor, image, math, time
from pyb import UART
import ustruct
from image import SEARCH_EX, SEARCH_DS
#传感器配置
sensor.set_contrast(1)
sensor.set_gainceiling(16)
#可以通过设置窗口来减少搜索的图像
#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))
#加载模板
#模板应该是一个小的灰度图像,如32×32.
clock = time.clock()
#-----------------------以下是巡线部分-----------------------------
# qq460219753
uart = UART(3,115200,bits=8, parity=None, stop=1, timeout_char = 1000)
#led = pyb.LED(3)
roi1 =     [(0, 40, 20, 40),        #  左  x y w h
            (35, 40, 20, 40),       #  中
            (70,40,10,10),
            (105,40,20,40),
            (140,40,20,40)]         # 右
#160 120
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA)#160x120
sensor.skip_frames(time=2000) # 跳过10帧,使新设置生效
sensor.set_auto_whitebal(True) # turn this off.
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_vflip(False)# 垂直方向翻转
sensor.set_hmirror(False)# 水平方向翻转
clock = time.clock()
#low_threshold = (0, 100)  # 105--115
#GRAYSCALE_THRESHOLD = [(20,100)]
#思路 现在需要除红线外全是黑色,红线为白
GROUND_THRESHOLD=(59, 25, 127, 19, -128, 89)
def sending_data(data):
    global uart;
    data = ustruct.pack("<bbb",      #格式为俩个字符俩个短整型(2字节)
                   0xA5,                      #帧头1
                   0xA6,
                   data
                   )        #数组大小为7,其中2,3,4,5为有效数据,0,1,6为帧头帧尾
    uart.write(data);   #必须要传入一个字节数组
    #print("head",data[0],"status",data[1],"tail",data[2])
    print(data[2])
getp=0
#GRAYSCALE_THRESHOLD =(59, 25, 127, 19, -128, 89)
GROUND_THRESHOLD1=(78, 24, 127, 18, -28, 59)
#GRAYSCALE_THRESHOLD =(100, 33, 114, 22, 11, 127)#(100, 33, 127, 28, -4, 127)#(100, 30, 127, 17, -37, 127)
while(True):
    data=0
    blob1=None
    blob2=None
    blob3=None
    blob4=None
    blob5=None
    flag = [0,0,0,0,0]
    img = sensor.snapshot().lens_corr(strength = 1.7 , zoom = 1.0)#畸变矫正
    #img.binary([low_threshold],invert = 1)#设置最低阈值 反转
    #img = sensor.snapshot().binary([GROUND_THRESHOLD])
    blob1 = img.find_blobs([GROUND_THRESHOLD1], roi=roi1[0]) #left
    blob2 = img.find_blobs([GROUND_THRESHOLD1], roi=roi1[1]) #middle
    blob3 = img.find_blobs([GROUND_THRESHOLD], roi=roi1[2])
    blob4 = img.find_blobs([GROUND_THRESHOLD1], roi=roi1[3])
    blob5 = img.find_blobs([GROUND_THRESHOLD1], roi=roi1[4])
    if blob1:
        flag[0] = 1  #左边检测到红线
    if blob2:
        flag[1] = 1  #中间检测到红线
    if blob3:
        flag[2] = 1  #右边检测到红线
    if blob4:
        flag[3] = 1  #中间检测到红线
    if blob5:
        flag[4] = 1  #右边检测到红线
    print(flag[0],flag[1],flag[2],flag[3],flag[4])
    for i in (0,1,2,3,4): # 0 1 2 3 4
        data|=(flag[i]<<(4-i))
    sending_data(data)
    for rec in roi1:
        img.draw_rectangle(rec, color=(255,0,0))#绘制出roi区域


相关文章
|
消息中间件 IDE JavaScript
用代码画时序图!YYDS
最近通过代码来看看这个图,给大家看图、UML ,感觉很给大家分享。 大家平时用他们出的图呢,是用什么样的图,都用画图来画的,我们用画图来画图 呢draw.io?processOn 今天给大家介绍一款想要的作品,用的画图,配合IDE使用PlantUML!
用代码画时序图!YYDS
|
10月前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
1322 15
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
12月前
|
Python
Matplotlib 教程 之 Matplotlib 中文显示 1
Matplotlib 中文显示教程:介绍如何在 Matplotlib 中正确显示中文,包括设置 Matplotlib 字体参数和下载支持中文的字体库。通过获取系统字体库列表,选择合适的中文字体进行配置。
240 0
|
12月前
|
芯片
【TI速成】半小时入门MSPM0G3507简明教程之按键定时器(二)
半小时入门MSPM0G3507简明教程之按键定时器
1143 0
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
254 6
|
IDE 开发工具 Android开发
OpenMV串口通讯详解
OpenMV串口通讯详解
1658 1
|
算法 计算机视觉
OpenCV-自适应阈值函数cv::adaptiveThreshold
OpenCV-自适应阈值函数cv::adaptiveThreshold
495 0
OpenCV-自适应阈值函数cv::adaptiveThreshold
|
移动开发 数据安全/隐私保护
钉钉可以集成企业内网部署的网盘系统实现账号单点登录吗?
最近接到客户的咨询,他们近期在公司局域网里部署了一套文档管理系统(一般叫私有网盘),领导希望平时通过手机钉钉就能访问到这套系统。客户就有些为难,钉钉是部署在公有云互联网环境的,而这套文档管理系统是部署在企业内网的,看上去应该打通不了,于是前来求助。
552 1