2023电赛E题——运动目标控制与自动追踪系统openmv部分(超详细)

        今年题目,发题之后之前所准备的与小车相关的都换了,今年是小车跟无人机结合,我们之前并无调试相关经验,所以选择了E题--运动目标控制与自动追踪系统,本篇将会重点分析openmv相关部分的代码,因为是为了电赛才刚学openmv摄像头,如果发现错误,请各位及时纠正,感谢各位大佬

第一部分:色块识别

        因为是刚学openmv摄像头,也是刚接触python语言没几天,所以一开始我们导入例程,用例程去学习它色块识别的思路,发现例程主要使用的是一个名为image.find_blobs()的函数,我们先来分析一下这个函数的相关信息

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

首先第一个变量参数就是thresholds是颜色的阈值,注意:这个参数是一个列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。

在本次比赛我就用到了这个办法(改变这个函数的相关变量)因为我们的靶纸比较大,在我们训练场地发现白纸本身的明暗程度就不一样,一开始我们想采用二值化,但后来感觉不太行,因为今年是要求本身能识别红色激光绿色激光跟白板与黑纸,这样的话首先要解决这个问题,首先我们在0.6*0.6的靶纸上在相隔一段距离的地方用红色激光笔打在上面,并用openmv IDE自带的阈值选择工具,选取出最佳的阈值,使得只有被红色及激光笔照到的部分变成白色其余均是黑色,但后来发现这一过程较难且我们摄像头的像素点较低,无法支持我们进行这么高精度的运算,当时我们所想到的方法有两个,一换用更加功率的激光笔;二是换用更好的摄像头,但奈于经费限制,只能换用更高功率的激光笔,但出了一些意外,客服不小心告诉错了我们额定电压是的电压错了,激光笔少烧了,于是只能想办法在现有条件的基础上进行调整。

        所以我们决定限制住roid的区域面积并且进行细分分成左上、右上、左下、右下、中心五个区域每个区域的红色阈值都不一样并且因为红色光线在黑线上和跟白纸上的大小跟阈值不一样所以我们打算再用多颜色识别的方法,这样可以更便于的识别,虽然识别效果肯定不如用更粗的激光笔好,但也能勉强识别到红色光点

第二部分矩形识别

第二部分没什么好说的就是用官方例程改一改就能用了

from machine import Pin
import sensor, image, time
import  pyb
from pyb import UART
import json
import ustruct
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA)  # 设置图像大小为160*120
#sensor.set_auto_exposure(False, 5000)#在这里调节曝光度,调节完可以比较清晰地看清激光点
sensor.skip_frames(10) #跳过几帧,让新的设置生效。
sensor.set_auto_whitebal(False)      # 设置自动白平衡
sensor.set_auto_gain(False)
#进入主函数
while(True):
    clock.tick()
    img = sensor.snapshot() #获取照片并且进行处理
   # 在图像中寻找矩形
    for r in img.find_rects(threshold = 10000):
        # 判断矩形边长是否符合要求
        if r.w() > 20 and r.h() > 20:
            # 在屏幕上框出矩形
            img.draw_rectangle(r.rect(), color = (255, 0, 0), scale = 4,roi=wer_roi)
            # 获取矩形角点位置
            corner = r.corners()
            # 在屏幕上圈出矩形角点
            img.draw_circle(corner[0][0], corner[0][1], 5, color = (256, 0, 0), thickness = 2, fill = False)
            img.draw_circle(corner[1][0], corner[1][1], 5, color = (256, 0, 0), thickness = 2, fill = False)
            img.draw_circle(corner[2][0], corner[2][1], 5, color = (256, 0, 0), thickness = 2, fill = False)
            img.draw_circle(corner[3][0], corner[3][1], 5, color = (256, 0, 0), thickness = 2, fill = False)
            #首先将获取到的corner元组转换成list类型
            ccs_list=list(corner)
            #其次建立四个列表分别存放矩形的四个顶点的坐标的相关信息
            cx=list(ccs_list[0])
            cy=list(ccs_list[1])
            cw=list(ccs_list[2])
            ch=list(ccs_list[3])

  第三部分发送部分

我们的在openmv上用串口发送相关代码如下

 #将上述的变量的相关信息封存获取一个名为FH的数据表其帧头为0x55和0xff
        FH = bytearray([0x55, cx_x , cx_y ,cy_x, cy_y,cw_x,cw_y,ch_x,ch_y,send_guang_x,send_guang_y,0xff])
        uart.write(FH)
        print(send_guang_x,send_guang_y  ,ch_x,ch_y)
        time.sleep_ms(2)

注意此部分需要在头文件声明,声明如下

from machine import Pin
import sensor, image, time
import  pyb
from pyb import UART
import json
import ustruct

请注意不要遗漏,是先打包,在发送

如有疑问请随时联系

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长了牙的无牙仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值