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


    如果有嵌入式企业需要招聘校园大使,湖南区域的日常实习,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02@gmail.com,此消息至2025年1月1日前均有效

    前言

    (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())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    跟踪激光灯

    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())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

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

    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())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    前端面试基础面试题——10
    计算机单位、变量、数据类型、类型转换、转义字符
    力扣第45天----第392题、第115题
    HBase面试题
    【定位问题】基于matlab chan+taylor算法移动基站无源定位【含Matlab源码 2089期】
    IDEA如何配置Tomcat
    redis为什么要自己实现SDS表示字符串
    DVWA靶场环境搭建
    【AXI】解读AXI协议乱序机制
    快速学会文件操作模块
  • 原文地址:https://blog.csdn.net/qq_63922192/article/details/132076300