AprilTag视觉定位的Android实现

AprilTag是一个视觉基准库,在AR,机器人,相机校准领域广泛使用。通过特定的标志(与二维码相似,但是降低了复杂度以满足实时性要求),可以快速地检测标志,并计算相对位置。

Apriltag提供了C编写的识别库,在github上找到AprilTag for Android项目,但是该项目把识别跟UI绑定在一起,不方便作为SDK引入到别的项目。

于是尝试把识别能力提取成独立的Lib,然后生成aar就能轻松放到其它项目中了。整理后的SDK Lib项目地址:https://gitee.com/petrochina-2/apriltag-detector-android-lib ,本文首发于 https://blog.csdn.net/keeng2008

Apriltag使用步骤:

  1. 使用该识别能力需要把 apriltag 生成 aar
    在gradle中找到 apriltag模块找到 assembleDebug 就能会在output目录中生成好 apriltag-1.0-debug.aar。
  2. 把 apriltag-1.0-debug.aar 复制到需要使用的项目中。
  3. 识别前需要初始化:
        val tagFamily = "tag16h5"val maxHammingError = 1   // 允许的错误的格子数val decimation = 8.0      // (抽帧)宽和高都会按比例抽取,数字越大则图越小。val sigma = 0.8           // 对分割图像应应用何种高斯模糊。参数是像素中的标准偏差。val nthreads = 4ApriltagNative.apriltag_init(tagFamily, maxHammingError, decimation, sigma, nthreads)

这里使用最简单的编译格式 tag16h5, 因为它的格子最少,更容易识别;但是它的标识数据也少,就31个不同的码,具体可以在这里下载 https://blog.csdn.net/zhuoqingjoking97298/article/details/122250204 。
如果要识别其它tag格式,修改参数即可。

  1. 识别Bitmap图片
    它的接口是识别YUV格式数据的,所以需要先把Bitmap转化为YUV再调用 ApriltagNative.apriltag_detect_yuv。
        val width = bitmap.widthval height = bitmap.heightval nv21 = BitmapUtil.bitmapToNv21(bitmap, width, height)val tagRes: List<ApriltagDetection> =ApriltagNative.apriltag_detect_yuv(nv21, width, height)

返回的是识别到的视觉码列表数据, 每个视觉码包含4个坐标点, 左上角为原点(0,0),依次顺序是

// 返回 [x0, y0, x1, y1, x2, y2, x3, y3]3  <---  2↑·0  -->   1

对应的YUV转换代码

    /*** Bitmap转化为ARGB数据,再转化为NV21数据** @param src    传入的Bitmap,格式为Bitmap.Config.ARGB_8888* @param width  NV21图像的宽度* @param height NV21图像的高度* @return nv21数据*/public static byte[] bitmapToNv21(Bitmap src, int width, int height) {if (src != null && src.getWidth() >= width && src.getHeight() >= height) {int[] argb = new int[width * height];src.getPixels(argb, 0, width, 0, 0, width, height);return argbToNv21(argb, width, height);} else {return null;}}/*** ARGB数据转化为NV21数据** @param argb   argb数据* @param width  宽度* @param height 高度* @return nv21数据*/private static byte[] argbToNv21(int[] argb, int width, int height) {int frameSize = width * height;int yIndex = 0;int uvIndex = frameSize;int index = 0;byte[] nv21 = new byte[width * height * 3 / 2];for (int j = 0; j < height; ++j) {for (int i = 0; i < width; ++i) {int R = (argb[index] & 0xFF0000) >> 16;int G = (argb[index] & 0x00FF00) >> 8;int B = argb[index] & 0x0000FF;int Y = (66 * R + 129 * G + 25 * B + 128 >> 8) + 16;int U = (-38 * R - 74 * G + 112 * B + 128 >> 8) + 128;int V = (112 * R - 94 * G - 18 * B + 128 >> 8) + 128;nv21[yIndex++] = (byte) (Y < 0 ? 0 : (Y > 255 ? 255 : Y));if (j % 2 == 0 && index % 2 == 0 && uvIndex < nv21.length - 2) {nv21[uvIndex++] = (byte) (V < 0 ? 0 : (V > 255 ? 255 : V));nv21[uvIndex++] = (byte) (U < 0 ? 0 : (U > 255 ? 255 : U));}++index;}}return nv21;}

关于性能提升:如果识别的视频帧可以获取到YUV格式的,最好直接使用YUV格式,就能节省一次转换的性能开销。
本文引入这个是为了在无人机中截取帧用于识别,无人机是支持获取到YUV数据的;同时Camera中也是能获取YUV的,直接使用YUV进行调用能节省这部分处理。

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

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

相关文章

鸿蒙仓颉语言【cryptocj 库】(介绍与SHA、MD5、HMAC摘要算法)

cryptocj 库 介绍 cryptocj 是一个安全的密码库&#xff0c;包括常用的密码算法、常用的密钥生成和签名验证。 该库是对 C 语言的 openSSL 封装的仓颉加密算法 1 提供SHA、MD5、HMAC摘要算法。 前置条件&#xff1a;NA 场景&#xff1a; OHOS&#xff0c; Linux&#xff…

经纬恒润与奇瑞汽车签订新能源项目重点供应商合作协议,共同开启合作新篇章

近日&#xff0c;2024年国家级芜湖经开区汽车零部件生态大会成功举行&#xff0c;经纬恒润受邀出席&#xff0c;与行业各伙伴齐聚经开区&#xff0c;同绘发展蓝图&#xff0c;助力经开区汽车产业高质量发展。会上&#xff0c;经纬恒润与奇瑞汽车签署合作协议&#xff0c;成为奇…

Superset二次开发之筛选器native Filters 水平布局

引言 Apache Superset作为一个功能强大的开源数据探索和可视化平台&#xff0c;提供了丰富的配置选项来定制化用户体验。其中&#xff0c;HORIZONTAL_FILTER_BAR 是一个重要的配置项&#xff0c;专注于优化和改进Superset中的筛选器条布局与交互。 什么是HORIZONTAL_FILTER_B…

免费【2024】springboot stone音乐播放器的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

【数据库】数据库设计规范文件(Word)

方便业务功能实现、业务功能扩展&#xff1b;方便设计开发、增强系统的稳定性和可维护性&#xff1b;保证数据完整性和准确性&#xff1b;提高数据存储效率&#xff0c;在满足业务需求的前提下&#xff0c;使时间开销和空间开销达到优化平衡。资料获取&#xff1a;本文本个人名…

江科大/江协科技 STM32学习笔记P9-11

文章目录 OLED1、OLED硬件main.c EXTI外部中断1、中断系统2、中断执行流程图3、STM32中断4、中断地址的作用5、EXTI6、EXTI基本结构7、AFIO复用IO口8、EXTI框图或门和与门 9、旋转编码器介绍10、硬件电路 OLED 1、OLED硬件 SCL和SDA是I2C的通信引脚&#xff0c;需要接在单片机…

机器学习的运作原理和算法分类,让机器学习更加通俗易懂

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

微信扫码登陆验证在Go系统开发时的应用与实践

微信扫码登录实现 登录流程 总体来说&#xff0c;就是三步&#xff1a; 点击微信登录&#xff0c;跳转到微信页面微信扫码登录&#xff0c;确认登陆微信跳转回来 这里&#xff0c;我们就得&#xff0c;明确两个问题&#xff1a; 跳到微信界面&#xff0c;跳过去的 URL 是什…

异常处理和swagger使用

全局异常处理类 定义全局异常处理类&#xff0c;会将错误全部提交到这个异常处理类中进行处理&#xff0c;这个类会将处理的统一结果响应给前端&#xff0c;如果不添加异常处理类&#xff0c;异常不会按照统一的响应格式进行&#xff0c;前端无法识别&#xff0c;当然也可以在…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

浏览器的最大并发数(http1.1)

HTTP/1.1&#xff1a;每个资源请求通常需要单独的TCP连接&#xff0c;尽管支持Keep-Alive机制&#xff0c;允许在同一个TCP连接上连续发送多个请求。但通常浏览器限制并发TCP连接数&#xff08;例如&#xff0c;每个域名最多6个并发连接&#xff09;。 HTTP/2&#xff1a;引入…

HarmonyOS三方库的使用

系统组件难以提供比较优秀的界面&#xff0c;需要第三方库来实现一些比较好看的界面效果 三方库的获取&#xff1a; 开源社区支持OpenHarmony-TPC 和 Openharmony三方库中心仓 先目前已经拥有各种各样的三方库&#xff0c;包括UI 图片 动画 网络 数据存储 工具类 多媒体 安全等…

leetcode 2236.判断根节点是否等于字节点

1.题目要求: 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。如果根结点值等于两个子结点值之和&#xff0c;返回 true &#xff0c;否则返回 false 。2.思路: 直接数组前序遍历&#xff0c;然后判断后面两个…

unity美术资源优化(资源冗余,主界面图集过多)

图片资源冗余&#xff1a; UPR unity的性能优化工具检查资源 1.检查纹理读/写标记 开启纹理资源的读/写标志会导致双倍的内存占用 检查Inspector -> Advanced -> Read/Write Enabled选项 2.检查纹理资源alpha通道 如果纹理的alpha通道全部为0&#xff0c;或者全部为2…

UEFI DebugLib 介绍

1.我们调试中常用Debug 打印信息&#xff0c;这些会输出到BIOS串口日志中 EFI_STATUSEFIAPIHelloWorld2(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable){EFI_STATUS Status;StatusEFI_SUCCESS;gST->ConOut->OutputString(gST->ConOut,L&q…

【vluhub】zabbix漏洞

介绍&#xff1a; zabbix是对服务器资源状态例如、内存空间、CPU、程序运行状态进行检测、设置预警值、短信设置等功能等一款开源工具。配置不当存在未授权,SQL注入漏洞 弱口令 nameadmin&passwordzabbix nameguest&password POST /index.php HTTP/1.1 Host: 192.1…

Flex布局中元素主轴上平均分布 多余的向左对齐

content&#xff1a;父元素 content-item: 子元素 主轴上子元素平均分布 .content {display: flex;flex-wrap: wrap;justify-content: space-between;.service-item {display: flex;flex-direction: column;justify-content: center;align-items: center;width: 80px;height:…

【C++】19.红黑树模拟实现 set 和 map

我们想要实现STL中的set和map&#xff0c;那么第一步就需要看一下库函数是如何实现的&#xff1a; 通过查看源代码我们发现两个容器都包含了stl_tree.h&#xff0c;因此我们猜测此头文件实现的是红黑树。 但是set和map很显然不是使用同一棵树实现的&#xff0c;那么STL库是怎么…

vue3 Axios封装使用

先安装axios&#xff1a; npm install axios 第一步&#xff1a;项目src下创建一个名为request的文件夹&#xff08;看一下示例图&#xff09;&#xff1a; 然后在request下创建两个api.ts和index.ts的文件 api.ts里的内容&#xff1a;&#xff08;url写你自己的接口&#xff…

Vscode——如何快速搜索项目工程中的某个文件的位置

第一步&#xff1a;按 shift ctrl p 第二步&#xff1a;然后把 > 删除 第三步&#xff1a;输入文件名称即可