《K230 从熟悉到...》识别机器码(AprilTag)

《K230 从熟悉到...》识别机器码(aprirltag)

  • tag id

《庐山派 K230 从熟悉到...》 识别机器码(AprilTag)

AprilTag是一种基于二维码的视觉标记系统,最早是由麻省理工学院(MIT)在2008年开发的。AprilTag的设计目标是为机器人视觉系统提供快速、可靠的视觉标记,特别适用于定位和跟踪应用。相比二维码和一维码,AprilTag有着更高的精度和更强的鲁棒性。

AprilTag通过在正方形的图案中使用独特的黑白图案来进行信息编码。与二维码不同,AprilTag的特点是它通过不同的标记ID来标识不同的标签,本身还包括误差修正能力,能够在一定程度上适应环境噪声和图像变形。一个AprilTag一般由一个黑色的边框和一组内部的二进制编码区域组成。每个AprilTag的编码方式是不同的,也就是说每个标记都有唯一的ID。

在这里插入图片描述

tag id

import time, os, sysfrom media.sensor import *
from media.display import *
from media.media import *
import time, math, os, gc, syspicture_width = 800
picture_height = 480sensor_id = 2
sensor = None# 显示模式选择:可以是 "VIRT"、"LCD" 或 "HDMI"
DISPLAY_MODE = "LCD"# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":# 虚拟显示器模式DISPLAY_WIDTH = ALIGN_UP(1920, 16)DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":# 3.1寸屏幕模式DISPLAY_WIDTH = 800DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":# HDMI扩展板模式DISPLAY_WIDTH = 1920DISPLAY_HEIGHT = 1080
else:raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")# 注意!与find_qrcodes不同,find_apriltags方法无需对图像进行镜像校正。# apriltag代码支持最多6个标签族,可以同时处理多个标签。
# 返回的标签对象将包含标签族和标签族内的标签ID。tag_families = 0
tag_families |= image.TAG16H5 # comment out to disable this family
#tag_families |= image.TAG25H7 # comment out to disable this family
#tag_families |= image.TAG25H9 # comment out to disable this family
#tag_families |= image.TAG36H10 # comment out to disable this family
#tag_families |= image.TAG36H11 # comment out to disable this family (default family)
#tag_families |= image.ARTOOLKIT # comment out to disable this family# 标签族之间有什么区别?例如,TAG16H5标签族是一个4x4的正方形标签,
# 这意味着它可以在较远的距离检测到,而TAG36H11标签族是6x6的正方形标签。
# 然而,较低的H值(H5相比H11)意味着4x4标签的误识别率要比6x6标签高得多。
# 所以,除非有特定需要,否则使用默认的TAG36H11标签族。def family_name(tag):if(tag.family() == image.TAG16H5):return "TAG16H5"if(tag.family() == image.TAG25H7):return "TAG25H7"if(tag.family() == image.TAG25H9):return "TAG25H9"if(tag.family() == image.TAG36H10):return "TAG36H10"if(tag.family() == image.TAG36H11):return "TAG36H11"if(tag.family() == image.ARTOOLKIT):return "ARTOOLKIT"try:# 构造一个具有默认配置的摄像头对象sensor = Sensor(id=sensor_id)# 重置摄像头sensorsensor.reset()# 无需进行镜像翻转# 设置水平镜像# sensor.set_hmirror(False)# 设置垂直翻转# sensor.set_vflip(False)# 设置通道0的输出尺寸sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)# 设置通道0的输出像素格式为GRAYSCALE(灰度)sensor.set_pixformat(Sensor.GRAYSCALE, chn=CAM_CHN_ID_0)#sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)# 根据模式初始化显示器if DISPLAY_MODE == "VIRT":Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)elif DISPLAY_MODE == "LCD":Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)elif DISPLAY_MODE == "HDMI":Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)# 初始化媒体管理器MediaManager.init()# 启动传感器sensor.run()# 创建一个FPS计时器,用于实时计算每秒帧数fps = time.clock()while True:os.exitpoint()# 更新FPS计时fps.tick()# 捕获通道0的图像img = sensor.snapshot(chn=CAM_CHN_ID_0)# 查找并处理AprilTag标签for tag in img.find_apriltags(families=tag_families):# 在图像中绘制标签的矩形框img.draw_rectangle([v for v in tag.rect()], color=(255, 0, 0))# 在标签中心绘制十字img.draw_cross(tag.cx(), tag.cy(), color=(0, 255, 0))# 显示标签IDimg.draw_string_advanced(tag.cx(), tag.cy(), 32, str(tag.id()))print_args = (family_name(tag), tag.id(), (180 * tag.rotation()) / math.pi)print("Tag Family %s, Tag ID %d, rotation %f (degrees)" % print_args)if tag.id() == 3:print("啦~啦~la la")# 显示捕获的图像,中心对齐,居中显示Display.show_image(img, x=int((DISPLAY_WIDTH - picture_width) / 2), y=int((DISPLAY_HEIGHT - picture_height) / 2))gc.collect()print(fps.fps())except KeyboardInterrupt as e:print("用户停止: ", e)
except BaseException as e:print(f"异常: {e}")
finally:# 停止传感器运行if isinstance(sensor, Sensor):sensor.stop()# 反初始化显示模块Display.deinit()os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)time.sleep_ms(100)# 释放媒体缓冲区MediaManager.deinit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动复习

应用层调用内核层函数称为系统调用 1.硬件设备管理 1,字符设备驱动(一个一个字节)——芯片内部外设 :WDT,Timer,adc,iic,SPI,R,UART,LCD,CAMERA,USB,Keyboard,Mouse 2,块设备驱动&a…

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)

1.问题描述: PC场景,青少年模式系统API不支持吗? 解决方案: PC场景,青少年模式系统API不支持,另外文档上的几个API也不支持。 2.问题描述: 华为一键登录 Beta7本地运行到手机可以拿到匿名手…

【gdutthesis模板】论文标题太长导致换页问题解决

标题太长导致换页问题解决方案如下: 调小下方数值即可

SAP学习笔记 - 豆知识18 - (TODO)Msg 番号 ME154 構成品目无法決定

1,现象 構成品目の決定は不可能です Msg 番号 ME154 構成品目无法決定 2,到Deepseek里找一下解决方案 SAP ME21N中错误「组件物料的确定不可行(ME154)」的解决步骤 此错误在创建分包采购订单时出现,通常由于系统无…

10.多线程

预备知识 预备知识一 预备知识二 预备知识三 如何理解进程和线程的关系,举一个生活中的例子 家庭:进程家庭成员:线程 每个家庭成员都会为这个家庭做贡献,只不过大家都在做不同的事情(比如:我们在上学&…

Python入门(8):文件

1. 文件基本概念 文件:存储在计算机上的数据集合,Python 通过文件对象来操作文件。 文件类型: 文本文件:由字符组成,如 .txt, .py 二进制文件:由字节组成,如 .jpg, .mp3 2. 文件打开与关闭…

市场交易策略优化与波动管理

市场交易策略优化与波动管理 在市场交易中,策略的优化和波动的管理至关重要。市场价格的变化受多种因素影响,交易者需要根据市场环境动态调整策略,以提高交易的稳定性,并有效规避市场风险。 一、市场交易策略的优化方法 趋势交易策…

HTTP数据传输的几个关键字Header

本文着重针对http在传输数据时的几种封装方式进行描述。 1. Content-Type(描述body内容类型以及字符编码) HTTP的Content-Type用于定义数据传输的媒体类型(MIME类型),主要分为以下几类: (一)、‌基础文本类型‌ text/plain‌ …

面向教育领域的实时更新RAG系统:核心模块设计与技术选型实践指南

目录 面向教育领域的实时更新RAG系统:核心模块设计与技术选型实践指南 一、业务需求分析 二、系统架构设计(核心模块) 三、核心模块详解与技术选型建议 (一)实时更新向量知识库 (二)教材与…

k8s patch方法更新deployment和replace方法更新deployment的区别是什么

在Kubernetes中,patch 和 replace 方法用于更新资源(如 Deployment),但它们的实现方式和适用场景有显著差异。以下是两者的核心区别: 1. 更新范围 replace 方法 完全替换整个资源配置。需要用户提供完整的资源定义&…

解决安卓手机WebView无法直接预览PDF的问题(使用PDF.js方案)

在移动端开发中,通过 webview 组件直接加载PDF文件时,不同平台的表现差异较大: iOS & 部分安卓浏览器:可正常内嵌预览(依赖系统内置PDF渲染能力) 大多数安卓设备:由于缺乏原生PDF插件&…

基于javaweb的SSM+Maven机房管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

7-6 混合类型数据格式化输入

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。 输入格式: 输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。 输出格式: 在一行中…

【GPIO8个函数解释】

函数解释 void GPIO_DeInit(GPIO_TypeDef* GPIOx); 作用:将指定GPIO端口的所有寄存器恢复为默认值。这会清除之前对该端口的所有配置,使其回到初始状态。使用方法:传入要复位的GPIO端口指针,例如GPIOA、GPIOB等。 void GPIO_AF…

将图表和表格导出为PDF的功能

<template><div><divref"pdfContent"style"position: relative; width: 800px; margin: 0 auto"><!-- ECharts 图表 --><div id"chart" style"width: 100%; height: 400px" /><!-- Element UI 表格 …

C++中的链表操作

在C中&#xff0c;链表是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据部分和指向下一个节点的指针。C标准库&#xff08;STL&#xff09;中提供了std::list和std::forward_list两种链表实现&#xff0c;分别对应双向链表和单向链表。此外&am…

蛋白设计 ProteinMPNN

传统方法的局限性是什么&#xff1f; 传统蛋白质设计方法的局限性&#xff1a; 基于物理的传统方法&#xff0c;例如罗塞塔&#xff0c;面临计算难度&#xff0c;因为需要计算所有可能结构的能量&#xff0c;包括不需要的寡聚态和聚合态。 设计目标与显式优化之间缺乏一致性通…

有哪些开源的视频生成模型

1. 阿里巴巴通义万相2.1&#xff08;WanX 2.1&#xff09; 技术架构&#xff1a;基于Diffusion Transformer&#xff08;DiT&#xff09;架构&#xff0c;结合自研的高效变分自编码器&#xff08;VAE&#xff09;和Flow Matching训练方案&#xff0c;支持时空上下文建模。参数…

【动态规划】最长上升子序列模板

最长上升子序列 题目传送门 一、题目描述 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N。 第二行包含 N 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 …

LeetCode 891 -- 贡献度思想

题目描述 子序列宽度之和 思路 ref 代码 相似题 子数组范围和 acwing