当前位置: 首页 > news >正文

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())
http://www.lryc.cn/news/106805.html

相关文章:

  • SAP CAP篇十二:AppRouter 深入研究
  • HDFS中数据迁移的使用场景和考量因素
  • 科普 | 以太坊坎昆升级是什么
  • C# 一些知识整理
  • SpringBoot复习:(15)Spring容器的核心方法refresh是在哪里被调用的?
  • Android安卓实战项目(5)---完整的健身APP基于安卓(源码在文末)可用于比赛项目或者作业参考中
  • AutoSAR系列讲解(实践篇)11.2-存储处理与Block
  • K8s总结
  • 3.playbook剧本二
  • 【MySQL】视图与用户管理
  • LINUX系统监控工具ATOP的使用
  • [回馈]ASP.NET Core MVC开发实战之商城系统(五)
  • iPhone 8透明屏的透明度高吗?
  • Vue2 第十五节 组件间通信方式
  • maven的下载与安装
  • BroadcastChannel 实现浏览器tab无刷新通讯
  • 98. Python基础教程:try...except...finally语句
  • c语言实现简单的tcp客户端
  • RocketMQ详解及注意事项
  • 选择适合的项目管理系统,了解有哪些选择和推荐
  • linux基础命令-cd
  • MySQL数据库分库分表备份
  • PyTorch 中的累积梯度
  • 【面试精品】运维工程师需要具备的核心能力有哪些?
  • 微服务实战项目-学成在线-选课学习(支付与学习中心)模块
  • postman和jmeter的区别何在?
  • maven安装(windows)
  • 自学安全卷不动,是放弃还是继续?
  • Django实现音乐网站 ⑶
  • (13) Qt事件系统(two)