2023年电赛e控制题视觉处理部分

2023-11-12

2023年电赛e控制题视觉处理部分

题目

在这里插入图片描述
在这里插入图片描述

视觉处理模块

openmv

处理思路

大致的思路是我这边识别黑色胶带矩形四个点位置,计算斜率,然后将一边的长度均分均分,每次x坐标设为1,有ab斜率y = k*b 计算y大致值,就得到一个大致的坐标,发送给电控。

基础全部代码

import sensor, image, time, math, ustruct,lcd,math
from pyb import UART
#thresholds =(0, 52, -128, 127, -128, 127)
#thresholds =(0, 43, -128, 127, -128, 127)
#thresholds =(0, 23, -128, 127, -128, 127)
thresholds =(0, 34, -128, 127, -128, 127)
roi = (85,30,165,170)# 开始roi的面积
flage = 100
corners = ([0,0],
           [0,0],
           [0,0],
           [0,0])
Rect = (0,0,0,0)
k = 0.0
b = 0
m = 0
n = 0
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
lcd.init()
clock = time.clock()
uart = UART(1,115200)
def outuart(x,y,flage):
    global uart;
    data = ustruct.pack("<bbhhhb",
                   0x2C,
                   0x12,
                   int(x*100),
                   int(y*100),
                   int(flage),
                   0x5B)
    uart.write(data);
    time.sleep_ms(20)
while(True):
    if flage == 100:
       print("等待电控给我值")
       flage = int(uart.readchar())
       print(flage)
       if flage == 150:
          flage = 0
       else:
          flage = 100
    if flage is not 100:
        clock.tick()
        img = sensor.snapshot()
        img.draw_rectangle((roi),color = (255,0,0), thickness=1,fill=False)
        #img.draw_circle(160+22, 120+2, 3, color = (0, 0, 0), thickness = 1, fill = True)
        img.draw_cross(160+22,120+2,color = (255,0,0),thickness=1)#画红色十字位置与激光在一个位置上

        for blob in img.find_blobs([thresholds],roi=roi,x_stride = 1, y_stride=1,pixels_threshold=300, area_threshold=300, merge=True):
            print("返回色块面积")
            print(blob.area())
            if blob.area()>8000 and blob.area()<30000:
                corners = blob.corners()
                A = corners[0]
                B = corners[1]
                C = corners[2]
                D = corners[3]
                #将ABCD四点的坐标转为十字为原点的坐标系下
                Ax = (A[0])-160-22
                Ay = (A[1])-120-2
                Bx = (B[0])-160-22
                By = (B[1])-120-2
                Cx = (C[0])-160-22
                Cy = (C[1])-120-2
                Dx = (D[0])-160-22
                Dy = (D[1])-120-2
                print("******A******")
                print(A)
                print("******B******")
                print(B)
                print("******C******")
                print(C)
                print("******D******")
                print(D)
                Rect  = blob.rect()
                rectx = int(Rect[0])
                recty = int(Rect[1])
                rectw = int(Rect[2])
                recth = int(Rect[3])
                '''rectx = rectx-20
                recty = recty-30
                rectw = rectw+40
                recth = recth+45'''
                rectx = rectx-40
                recty = recty-40
                rectw = rectw+70
                recth = recth+90

                roi = (rectx,recty,rectw,recth)
                img.draw_edges(blob.corners(), color=(0,255,255),thickness=3)
                #画图abcd四个点
                img.draw_string((corners[0])[0],(corners[0])[1],"A",color = (0,255,255),scale=4, mono_space=False)
                img.draw_string((corners[1])[0],(corners[1])[1],"B",color = (0,255,255),scale=4, mono_space=False)
                img.draw_string((corners[2])[0],(corners[2])[1],"C",color = (0,255,255),scale=4, mono_space=False)
                img.draw_string((corners[3])[0],(corners[3])[1],"D",color = (0,255,255),scale=4, mono_space=False)
                img.draw_rectangle(blob.rect())
                k1 = str(k)
                img.draw_string(5,5,"k:"+k1,color = (255,0,0),scale=4, mono_space=False)
                #四条边的判断以及与电控通信
                if flage == 0:
                    outuart(Ax,Ay,flage)
                    print("111111111111111111111111111")
                    print(Ax,Ay)


                    if abs(Ax)<3 and abs(Ay)<3:
                        time.sleep_ms(500)
                        flage = 1
                        outuart(0,0,10)
                        print("--------------------------------")
                if flage == 1:
                    print("222222222222222222222222222")
                    if Bx is not 0:
                        bk= By/Bx
                        x=1.0
                        y=1.0*bk
                        outuart(x,y,flage)
                        print(Bx,By)

                        if abs(Bx)<5 and abs(By)<5:

                            time.sleep_ms(500)
                            flage = 2
                            outuart(0,0,10)
                if flage == 2:
                    print("333333333333333333333333333333333")
                    if Cx is not 0:
                        ck = Cy/Cx
                        x=1.0
                        y=1.0*ck
                        outuart(x,y,flage)
                        #outuart(0,0,10)
                        print(Cx,Cy)
                        if abs(Cx)<4.5 and abs(Cy)<4.5:
                            outuart(0,0,10)
                            time.sleep_ms(500)
                            flage = 3
                            print("--------------------------------")
                if flage == 3:
                    print("444444444444444444444444444444444")
                    if Dx is not 0:
                        dk = Dy/Dx
                        x=-1.0
                        y=-1.0*dk
                        outuart(x,y,flage)
                        print(Dx,Dy)
                        if abs(Dx)<5 and abs(Dy)<5.5:
                            outuart(0,0,10)
                            time.sleep_ms(500)
                            flage = 4
                            print("--------------------------------")
                if flage == 4:
                    print("555555555555555555555555555555555")
                    if Ax is not 0:
                        ak = Ay/Ax
                        x=-1.0
                        y=-1.0*ak
                        outuart(x,y,flage)
                       # outuart(0,0,10)
                        print(Ax,Ay)
                        if abs(Ax)<4.5 and abs(Ay)<4.5:
                            outuart(0,0,10)
                            time.sleep_ms(500)
                            outuart(0,0,20)
                            print("--------------------------------")
                            flage = 100
                            break
        #lcd.display(img,x_scale=0.3,y_scale = 0.4)
        print(clock.fps())

提高部分

思路

其实很简单识别红色的激光色块然后进行坐标转换,计算出目标的位置发给电控就ok了

提高部分代码

import sensor, image, time,ustruct,lcd,math
from pyb import UART,LED
thresholds_red1 = (12, 100, 3, 127, -128, 127)
t2 =(5, 100, -128, 127, -128, 127)
center = [0,0]     #红色激光笔的位置
roi = (100,60,126,140)
flage = 0.0     # 是否追上
#img.draw_cross(160-3,120-1,color = (255,0,0),thickness=2)  #绿色十字的位置
sensor.reset()                      # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000)     # Wait for settings take effect.
clock = time.clock()                # Create a clock object to track the FPS.
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
sensor.set_auto_exposure(False,9000)
uart = UART(3,115200)

def outuart(x,y,flage):
 global uart;
 #frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
 #data = bytearray(frame)
 data = ustruct.pack("<bbhhhb",      #格式为俩个字符俩个短整型(2字节)
                0x2C,                      #帧头1
                0x12,                      #帧头2
                int(x*100), # up sample by 4    #数据x坐标
                int(y*100), # up sample by 4    #数据y坐标
                int(flage), # up sample by 4     #FLAGE
                0x5B)

 uart.write(data);  #必须要传入一个字节数组

 time.sleep_ms(10)

while(True):
 clock.tick()                    # Update the FPS clock.
 img = sensor.snapshot()
 img.binary([thresholds_red1])
 img.dilate(1)
 #img.draw_rectangle((roi),color = (0,0,255), thickness=1,fill=False)  #画出roi

 Blob = img.find_blobs([t2],roi = roi,pixels_threshold=2, area_threshold=15, merge=True,invert = 0)
 if not Blob:
         outuart(0,0,10)
 for b in Blob:

     print("光斑的面积大小")
     print(b.area())
     area = b.area()
     if area>20 and area<500:
     # 打印激光色块的中心位置  下面获取的坐标基于图像的左上角为原点(0, 0),X轴向右增大,Y轴向下增大
     # 使用b.x()获取色块矩形左上角X坐标
     # 使用b.y()获取色块矩形左上角Y坐标
     # 使用b.w()获取色块矩形宽度
     # 使用b.h()获取色块矩形高度
     # 矩形中心坐标为(x + w/2,y + h/2)
         img.draw_rectangle(b.rect(), color = (255,0 , 0), scale = 2, thickness = 5)
         center[0] = (b.x() + b.w()/2)-160+4          #x
         center[1] = (b.y() + b.h()/2)-120+8          #y
         Ax = center[0]
         Ay = center[1]
         rectx = b.x()-30
         recty = b.y()-30
         rectw = b.w()+60
         recth = b.h()+60
         roi = (rectx,recty,rectw,recth)
         print("距离*************************************")
         dis = math.sqrt(abs(Ax)*abs(Ax)+abs(Ay)*abs(Ay))
         print(dis)
         #if dis>2 and dis <15:
             #roi = roi
         if dis>2:
             outuart(Ax,Ay,flage)

         if dis<=7.2 and dis>2:
             flage = 1
             outuart(Ax,Ay,flage)
             print("报警")
             LED(1).on()
             outuart(Ax,Ay,10)

         if dis>7.2:
             flage = 0
             print("不报警")
             outuart(Ax,Ay,flage)
             LED(1).off()
             outuart(Ax,Ay,10)





 print(clock.fps())          

在这里插入图片描述

大致的效果,我调的也不是很好只能是这样

电赛e题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023年电赛e控制题视觉处理部分 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • Pygame读取MIDI输入

    我参考了Pygame MIDI 文档 https www pygame org docs ref midi html and 这段代码 https stackoverflow com questions 62983509 pygame mi
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • 串的模式匹配(KMP算法)

    问题描述 串的模式匹配算法实现 KMP算法 输入形式 第一行输入主串s 第二行输入模式串t 第三行输入起始位置pos 输出形式 输出模式串t的next值 以空格分隔 输出模式匹配结果 样例输入1 ababcabcacbab abcac 1
  • 为什么输入法显示中文打不出中文_输入法为什么打不出汉字_电脑输入法打不出汉字如何解决-win7之家...

    我们要在电脑中使用输入法打字的时候 不急可以打出汉字也可以打出英文 不过有不少用户却遇到了输入法打不出汉字的情况 这让用户们很苦恼 那么输入法为什么打不出汉字呢 一般出现这样的问题是输入法出现了问题 我们只要修复一下即可 赶快随小编一起来看
  • # 后端开发技巧、常用规范

    后端开发技巧 常用规范 文章目录 后端开发技巧 常用规范 开发技巧 equals 方法的使用 创建 HashMap 指定初始化大小 Optional ofNullable orElse 避免空指针 Stream 求和 List 切割工具 单
  • vue引用js文件的多种方式

    1 vue cli webpack全局引入jquery 1 首先 npm install jquery save save 的意思是将模块安装到项目目录下 并在package文件的dependencies节点写入依赖 2 在webpack
  • radius的认证过程

    转载自 http blog donews com zyqin archive 2008 09 01 1341486 aspx RADIUS 远程用户拨号认证系统 是Remote Authentication Dial In User Ser
  • UE4加载使用自定义dll动态链接库

    本人在写这篇文章时候 网上已经有很多相关的文章 但是网上的文章缺少逐步指引 本人看的云里雾里 估计刚接触相关工作的人看的也不是很清楚 本着自己记录和让他人少踩一些坑的宗旨 这篇文章诞生了 好了 不多BB 直接进入主题 创建自定义dll动态链
  • JVM垃圾回收机制简介

    JVM垃圾回收机制 深入理解Java虚拟机 阅读笔记 需要先了解一定的JVM内存模型知识 下面是笔者学习的笔记 仅供参考 JVM内存模型的简单介绍和对象的初始化过程 Java语言在设计之初就考虑到C 复杂的指针管理和内存泄漏等问题 因此实现
  • 数据分析系列之电力窃漏电用户自动识别

    在线监测用户用电负荷数据 经过数据预处理 得到模型输入数据 利用构建好的识别模型计算用户窃漏电诊断结果 实现窃漏电用户的实时诊断 并与实际稽查结果对比 背景与挖掘目标 传统的防窃漏电方法主要是通过定期巡检 定期校验电表 用户举报窃电等方法来
  • 达梦数据库如何查看和修改系统参数

    查看初始化级别的系统参数 通过视图option查查 初始化后不能修改 修改配置文件dmconfig ini后只能重新初始化实例 select from v option where PARA NAME like CASE SENSITIVE
  • 函数(二)

    紧接上文 我们把函数的基础语法结束了 本章将讲解到较为难一点的内容 譬如递归调用 一 函数的嵌套调用和链式访问 函数与函数之间并不是独立存在的 函数和函数之间可以根据实际的需求进行组合的 也就是互相调用的 嵌套调用 举例 include
  • 关于pytorch和tensorflow的GPU版本安装过程中的问题(MX450)

    最近在学习深度学习 想在一台MX450显卡的小米笔记本电脑装pytorch和tensorflow 以下内容为方便自己以后查看 若有问题 请在评论指出 谢谢 环境 WIN10 MX450 Anaconda Pycharm 最新补充 pytor
  • bash: jps: 未找到命令...,常见错误,快速解决

    出现以上错误 我的解决方法是 下载插件 sudo yum install java 1 8 0 openjdk devel x86 64 输入两个y后 出现以下即成功了 再jps一下就可以显示出进程了
  • 带你玩转以太坊智能合约的”Hello World“

    学习目标 使用solidity语言撰写智能合约 开发前的准备 Ubuntu环境下Atom编辑器安装及使用 安装所需工具 安装nvm 安装node 安装npm 启动testrpc 建立项目 目录结构 新建HelloWorld合约 代码说明 编
  • 超全总结:神经网络加速之量化模型

    作者丨郝泽宇 学校丨西安交通大学人机所硕士生 研究方向丨深度神经网络压缩 鸣谢 XJTU 魏亚东 I C 董豪 量化模型 Quantized Model 是一种模型加速 Model Acceleration 方法的总称 包括二值化网络 Bi
  • Socket错误连接超时的解决方法

    flashfxp 选项 gt 参数选择 gt 链接 gt FTP gt 数据连接模式里面将被动模式改为主动模式
  • Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境

    欢迎加入讨论群 64770604 1 开发环境 1 下载开发环境 Arduino的开发环境从http arduino cc en Main Software官网下载即可 分为windows版本 Mac版本 linux 32 64位 目前已更
  • 怎样更改linux的用户名

    Linux将用户名修改后 还需要修改 组名 家目录 UID 这只会更改用户名 而其他的东西 比如用户组 家目录 UID 等都保持不变 1 修改用户名 usermod l 新用户 旧用户 这只会更改用户名 而其他的东西 比如用户组 家目录 I
  • UML图学习

    前言 UML是一种建模语言 是系统建模的标准 我们之所以建模是因为大规模的系统设计时相当复杂的 当系统比较复杂时就会涉及到以下这几个问题 开发人员如何与用户进行沟通来了解系统的需求 开发人员之间如何沟通以确保各个部门能够无缝地协作 而UML
  • 十大机器学习算法-梯度提升决策树(GBDT)

    简介 梯度提升决策树 GBDT 由于准确率高 训练快速等优点 被广泛应用到分类 回归合排序问题中 该算法是一种additive树模型 每棵树学习之前additive树模型的残差 许多研究者相继提出XGBoost LightGBM等 又进一步
  • 2023年电赛e控制题视觉处理部分

    2023年电赛e控制题视觉处理部分 题目 视觉处理模块 openmv 处理思路 大致的思路是我这边识别黑色胶带矩形四个点位置 计算斜率 然后将一边的长度均分均分 每次x坐标设为1 有ab斜率y k b 计算y大致值 就得到一个大致的坐标 发