2023年电赛---运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV

简介: 2023年电赛---运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV

前言

(1)已经有不少同学根据我上一篇博客完成了前三问,恭喜恭喜。有很多同学卡在了第四问。

(2)我说了OpenART mini的代码是可行的。但是他们不会移植到OpenMV上,再次我讲移植之后的代码贴出来。

(3)吐槽一下,我就看不懂了。为啥这么多人移植不了。这不是几分钟的事情吗?(苦笑)


识别矩形框以及对应角点

(1)这个地方的40行会出现一个奇怪的报错,说corner没有被定义。但是前面明明调用corner = r.corners()进行了一波定义。

(2)然后我在在前面写上了一句corner = 0,报错就消失了。这个bug很奇怪。希望各位注意

from machine import Pin
import sensor, image, time
import pyb
#import seekfree, pyb
# 初始化TFT180屏幕
#lcd = seekfree.LCD180(3)
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA)  # 设置图像大小为160*120
sensor.set_auto_whitebal(True)      # 设置自动白平衡
sensor.set_brightness(3000)         # 设置亮度为3000
sensor.skip_frames(time = 20)       # 跳过帧
clock = time.clock()
corner = 0
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)
            # 获取矩形角点位置
            corner = r.corners()
            # 在屏幕上圈出矩形角点
            img.draw_circle(corner[0][0], corner[0][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[1][0], corner[1][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[2][0], corner[2][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[3][0], corner[3][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
        # 打印四个角点坐标, 角点1的数组是corner[0], 坐标就是(corner[0][0],corner[0][1])
        # 角点检测输出的角点排序每次不一定一致,矩形左上的角点有可能是corner0,1,2,3其中一个
        corner1_str = f"corner1 = ({corner[0][0]},{corner[0][1]})"
        corner2_str = f"corner2 = ({corner[1][0]},{corner[1][1]})"
        corner3_str = f"corner3 = ({corner[2][0]},{corner[2][1]})"
        corner4_str = f"corner4 = ({corner[3][0]},{corner[3][1]})"
        print(corner1_str + "\n" + corner2_str + "\n" + corner3_str + "\n" + corner4_str)
    # 显示到屏幕上,此部分会降低帧率
    #lcd.show_image(img, 160, 120, 0, 0, zoom=0)  #屏幕显示
    # 打印帧率
    #print(clock.fps())

跟踪激光灯

from machine import Pin
import sensor, image, time
import pyb
#import seekfree, pyb
# 初始化激光灯控制引脚P0,并置为高电平
laser_light=Pin("P0", Pin.OUT)
laser_light.value(1)
# 初始化TFT180屏幕
#lcd = seekfree.LCD180(3)
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA)  # 设置图像大小为160*120
sensor.set_auto_whitebal(True)      # 设置自动白平衡
sensor.set_brightness(3000)         # 设置亮度为3000
sensor.skip_frames(time = 20)       # 跳过帧
clock = time.clock()
while(True):
    clock.tick()
    img = sensor.snapshot()
# -----跟踪激光部分-----
    # 设置激光颜色阈值
    red_td = [(56, 100, 45, 127, -128, 127)]  # 这里要改
    # 根据阈值找到色块
    for b in img.find_blobs(red_td,pixels_threshold=2, area_threshold=15, merge=True,invert = 0):
        # 在屏幕上画出色块
        img.draw_rectangle(b.rect(), color = (0, 255, 0), scale = 2, thickness = 2)
        # 打印激光色块的中心位置
        # 使用b.x()获取色块矩形左上角X坐标
        # 使用b.y()获取色块矩形左上角Y坐标
        # 使用b.w()获取色块矩形宽度
        # 使用b.h()获取色块矩形高度
        # 矩形中心坐标为(x + w/2,y + h/2)
        print(f"rect = {b.x() + b.w()/2},{b.y() + b.h()/2}")
        break
    # 显示到屏幕上,此部分会降低帧率
    #lcd.show_image(img, 160, 120, 0, 0, zoom=0)  #屏幕显示
    # 打印帧率
    #print(clock.fps())


识别矩形框以及对应角点并跟踪激光灯

from machine import Pin
import sensor, image, time
#import seekfree, pyb
import  pyb
# 初始化激光灯控制引脚,并置为高电平
laser_light=Pin("P9", Pin.OUT)
laser_light.value(1)
# 初始化TFT180屏幕
#lcd = seekfree.LCD180(3)
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA)  # 设置图像大小为160*120
sensor.set_auto_whitebal(True)      # 设置自动白平衡
sensor.set_brightness(3000)         # 设置亮度为3000
sensor.skip_frames(time = 20)       # 跳过帧
clock = time.clock()
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)
            # 获取矩形角点位置
            corner = r.corners()
            # 在屏幕上圈出矩形角点
            img.draw_circle(corner[0][0], corner[0][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[1][0], corner[1][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[2][0], corner[2][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[3][0], corner[3][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            # 角点坐标打印详见OpenART mini识别矩形框以及对应角点文件
# -----跟踪激光部分-----
    # 设置激光颜色阈值
    red_td = [(56, 100, 45, 127, -128, 127)]
    # 根据阈值找到色块
    for b in img.find_blobs(red_td,pixels_threshold=2, area_threshold=15, merge=True,invert = 0):
        # 在屏幕上画出色块
        img.draw_rectangle(b.rect(), color = (0, 255, 0), scale = 2, thickness = 2)
        break
        # 坐标打印详见OpenART mini跟踪激光灯文件
    # 显示到屏幕上,此部分会降低帧率
    #lcd.show_image(img, 160, 120, 0, 0, zoom=0)  #屏幕显示
    # 打印帧率
    print(clock.fps())
目录
相关文章
|
编解码 IDE 算法
2023年电赛---运动目标控制与自动追踪系统(E题)发挥题思路
2023年电赛---运动目标控制与自动追踪系统(E题)发挥题思路
636 0
|
传感器
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
3905 1
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
|
4月前
|
传感器 C# 监控
硬件交互新体验:WPF与传感器的完美结合——从初始化串行端口到读取温度数据,一步步教你打造实时监控的智能应用
【8月更文挑战第31天】本文通过详细教程,指导Windows Presentation Foundation (WPF) 开发者如何读取并处理温度传感器数据,增强应用程序的功能性和用户体验。首先,通过`.NET Framework`的`Serial Port`类实现与传感器的串行通信;接着,创建WPF界面显示实时数据;最后,提供示例代码说明如何初始化串行端口及读取数据。无论哪种传感器,只要支持串行通信,均可采用类似方法集成到WPF应用中。适合希望掌握硬件交互技术的WPF开发者参考。
82 0
|
7月前
|
机器学习/深度学习 计算机视觉
LabVIEW开发自动读取指针式仪表测试系统
LabVIEW开发自动读取指针式仪表测试系统
60 7
|
7月前
|
传感器 存储 数据采集
LabVIEW通过视频识别开发布氏硬度机自动化测量系统
LabVIEW通过视频识别开发布氏硬度机自动化测量系统
50 4
|
7月前
|
文字识别 算法 机器人
LabVIEW利用相机开发零件处理和检查系统
LabVIEW利用相机开发零件处理和检查系统
33 4
|
异构计算
【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例
【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例
107 0
|
7月前
|
传感器 编解码
LabVIEW编程LabVIEW开发 控制RITEC RAM-5000 SNAP非线性高能超声测试系统例程与相关资料
LabVIEW编程LabVIEW开发 控制RITEC RAM-5000 SNAP非线性高能超声测试系统例程与相关资料
77 0
|
7月前
|
传感器 数据采集 监控
LabVIEW 开发在不确定路况下自动速度辅助系统
LabVIEW 开发在不确定路况下自动速度辅助系统
30 0
|
Android开发 开发者
Android平台GB28181设备接入模块之球机/云台控制探究
好多开发者在做GB28181设备接入的时候,问云台控制是否可以处理(亦或拉取外部RTSP摄像头,通过命令中转的方式,控制摄像头),实际上云台控制命令相对来说还是比较好处理的。协议规范有明确说明,云台控制命令不需要发送应答命令,实现相对简单,和我们之前做的远程启动命令(TeleBoot)类似。
166 0