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

2025电赛e题:openmv识别过程丢失矩形

openmv识别矩形,可能会乱识别,导致激光乱飞,这里有两个思路

主体思路如下

在目标再识别与跟踪过程中,系统通过以下两个核心机制实现稳定追踪:

  1. 云台动态校准机制

  • 实时采集视频流中的目标矩形框坐标数据

  • 通过PID控制算法动态调整云台俯仰/偏转角度

  • 以画面中心点为基准建立坐标系(1920x1080分辨率下(960,540)为原点)

  • 计算目标矩形中心点(x,y)与画面中心的欧式距离偏差

  • 当偏差超过±15像素阈值时触发云台伺服电机补偿

  • 在多目标场景下,优先选择几何中心最近的目标矩形

  1. 框角位置约束机制

  • 建立目标框角坐标历史缓存队列(最近5帧数据)

  • 对当前帧检测到的四个框角坐标(x1,y1)...(x4,y4)进行验证:
    a) 与上一帧对应框角坐标进行差分比较
    b) 设置±10像素的动态容差范围(可配置参数)
    c) 采用滑动窗口均值滤波消除瞬时抖动

  • 当3个及以上框角满足位置约束时,判定为有效跟踪

  • 对于超出阈值的异常框角,采用卡尔曼滤波进行位置预测补偿

  • 连续3帧校验失败时触发目标重识别流程

该系统在实测中达到:

  • 云台响应延迟 < 80ms

  • 框角位置稳定性 > 92%(在30fps视频流中)

  • 可耐受目标瞬时遮挡(最长12帧)

1,再识别过程中实时调整云台位置,确保矩形一直在中点位置,然后寻找距离中点位置最近的矩形。

2,识别过程中,保存四个框角的位置,确保每次矩形更新时,四个框角都在上次保存框角的正负10像素以内(已验证)

这里主要说下2

1. 首次识别时锁定目标矩形的精确角点坐标
2. 后续帧只接受角点变化在±10像素范围内的矩形
3. 连续丢失目标时自动进入保护模式

伪代码如下:

while(1):if(flag_first==0):if(识别到矩形):for(寻找距离中点最近的矩形):将矩形四个点坐标加入到数组中flag_first == 1if(flag_first==1):if(识别到矩形):if(矩形四个点坐标在上次数组的+-10像素以内)更新矩形四个点坐标到数组返回矩形中点        

部分代码如下图所示

while (True):clock.tick()img = sensor.snapshot()detected_rects = img.find_rects(threshold=10000)if tracking_flag == 0:min_distance = float('inf')target_rect = Nonefor r in detected_rects:corners = r.corners()center_x = sum(p[0] for p in corners) / 4center_y = sum(p[1] for p in corners) / 4distance = ((center_x - search_center[0]) ** 2 +(center_y - search_center[1]) ** 2) ** 0.5if distance < min_distance:min_distance = distancetarget_rect = rif target_rect:corners = target_rect.corners()for i in range(4):rect[i * 2] = corners[i][0]rect[i * 2 + 1] = corners[i][1]tracking_flag = 1print("进入追踪模式,初始矩形:", rect)elif tracking_flag == 1:matched_rect = Nonefor r in detected_rects:current_corners = r.corners()all_match = Truefor i in range(4):if (abs(current_corners[i][0] - rect[i * 2]) > 10 orabs(current_corners[i][1] - rect[i * 2 + 1]) > 10):all_match = Falsebreakif all_match:matched_rect = rbreakif matched_rect:corners = matched_rect.corners()for i in range(4):rect[i * 2] = corners[i][0]rect[i * 2 + 1] = corners[i][1]else:passif tracking_flag == 1:points = [(rect[0], rect[1]), (rect[2], rect[3]),(rect[4], rect[5]), (rect[6], rect[7])]print("追踪中的矩形:", points)for i in range(4):start = points[i]end = points[(i + 1) % 4]img.draw_line(start[0], start[1], end[0], end[1], color=(255, 255, 255))center_x = sum(p[0] for p in points) / 4center_y = sum(p[1] for p in points) / 4img.draw_cross(int(center_x), int(center_y), color=(0, 255, 0), size=5)img.draw_string(int(center_x + 10), int(center_y),"TRACKING" if tracking_flag else "SEARCHING",color=(255, 0, 0))if center_y > red_ponit_y:motor1(0, int((center_y - red_ponit_y) / 10))  # 向下elif center_y < red_ponit_y:motor1(1, int((red_ponit_y - center_y) / 10))  # 向上if center_x > red_ponit_x:motor2(1, int((center_x - red_ponit_x) / 10))  # 向左elif center_x < red_ponit_x:motor2(0, int((red_ponit_x - center_x) / 10))  # 向右

 

这里不贴全代码了,但验证过是可以的,所以各位加油吧

http://www.lryc.cn/news/606198.html

相关文章:

  • laravel下phpunit的使用
  • Web开发-PHP应用Cookie脆弱Session固定Token唯一身份验证数据库通讯
  • 分享低功耗单火线开关语音识别方案
  • Python 程序设计讲义(49):组合数据类型——字典类型:字典的方法
  • Linux/Ubuntu 系统中打开火狐firefox、chromium浏览器失败
  • 33.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--财务服务--记账
  • Python Day20 os模块 和 文件操作 及 例题分析
  • 智能文本抽取技术:精准识别、定位并提取出关键信息
  • 学以致用——用Docker搭建ThinkPHP开发环境
  • linux线程互斥和同步
  • 在处理大数据列表渲染时,React 虚拟列表是提升性能的关键技术,但在实际实现中常遇到渲染抖动和滚动定位偏移等问题。
  • 大语言模型信息抽取系统解析
  • Tomcat,WebLogic等中间件漏洞实战解析
  • C++异常处理的成本:理解与优化
  • MySQL转PostgreSQL迁移实战:从语法错误到完美兼容
  • AI学习笔记三十三:基于Opencv的单目标跟踪
  • vue3 v-html绑定数据,点击sub实现popover效果
  • STM32 USB 设备中间件 tinyusb
  • 超宽带测距+测角+无线通信一体化模组:智能门锁、智能遥控器、AR头戴、智能穿戴
  • 融媒体中心网络安全应急预案(通用技术框架)
  • Vmvare虚拟机的网络不可达问题
  • Spring Boot 异常处理:从全局捕获到优化用户体验!
  • 爱心烟花浪漫立方体轮播图 - 用代码表达爱意
  • 为Github Copilot创建自定义指令/说明/注意事项
  • 决策树实现回归任务
  • 基于Spring Boot实现中医医学处方管理实践
  • 【Agent,智能,workflow】
  • 【RH134 问答题】第 13 章 运行容器
  • uvicorn 启动重复加载 多次加载
  • [12月考试] B