MaixCAM MaixPy 识别 Apriltag 标签
更新历史
日期 | 版本 | 作者 | 更新内容 |
---|---|---|---|
2024-04-03 | 1.0.0 | lxowalle | 初版文档 |
阅读本文前,确保已经知晓如何开发MaixCAM,详情请阅读快速开始
一、简介#
本文介绍如何使用MaixPy来识别Apriltag标签
二、使用 MaixPy 识别Apriltag标签#
MaixPy的 maix.image.Image
中提供了find_apriltags
方法,可以可以识别apriltag标签。
2.1. 如何识别Apriltag标签#
一个简单的示例,实现识别apriltag标签并画框
步骤:
导入image、camera、display模块
初始化摄像头和显示
从摄像头获取图片并显示
调用
find_apriltags
方法识别摄像头图片中的apriltag标签img
是通过cam.read()
读取到的摄像头图像img.resize(160, 120)
是用来将图像缩放得更小,用更小的图像来让算法计算得更快new_img.find_apriltags(families = families)
用来寻找apriltag标签,并将查询结果保存到apriltags
,以供后续处理。其中families用来选择apriltag族,默认为image.ApriltagFamilies.TAG36H11
处理识别标签的结果并显示到屏幕上
- 遍历
apriltags
的成员,apriltags
是通过img.find_apriltags()
扫描apriltag标签的结果,如果找不到标签则apriltags
的成员为空 x_scale
和y_scale
用来映射坐标,由于new_img
是缩放后的图像,计算apriltag的坐标时需要经过映射后才能正常的画在原图img
上a.corners()
用来获取已扫描到的标签的四个顶点坐标,img.draw_line()
利用这四个顶点坐标画出标签的形状img.draw_string
用来显示标签的内容,其中a.x()
和a.y()
用来获取标签左上角坐标x和坐标y,a.id()
用来获取标签的id,a.family()
用来获取标签族类型,a.rotation()
用来获取标签的旋转角度。
- 遍历
2.2. 常用参数说明#
列举常用参数说明,如果没有找到可以实现应用的参数,则需要考虑是否使用其他算法实现,或者基于目前算法的结果扩展所需的功能
参数 | 说明 | 示例 |
---|---|---|
roi | 设置算法计算的矩形区域,roi=[x, y, w, h],x,y表示矩形区域左上角坐标,w,h表示矩形区域的宽度和高度,默认为整张图片 | 计算坐标为(50,50),宽和高为100的区域img.find_apriltags(roi=[50, 50, 100, 100]) |
families | apriltag标签家族类型 | 扫描TAG36H11家族的标签img.find_apriltags(families = image.ApriltagFamilies.TAG36H11) |
本文介绍常用方法,更多 API 请看 API 文档的 image 部分。
2.3. 测距1:物体垂直与摄像头的距离#
这里提供一种使用distance=k/width
的公式来测距, 其中distance
是摄像头和物体的距离,单位mm
, k
是一个常量, width
是物体在画面中的宽度,单位是像素点.
测量方法分两步: 1. 测量常量系数k; 2. 通过常量系数和标签宽度来计算物体与摄像头的距离
2.3.1. 前期准备#
apriltag
标签纸- 尺子(或其他测距工具)
2.3.2. 测量常量系数k#
将
apriltag
标签纸固定,并在距离apriltag
标签20cm处固定maixcam
使用
maixcam
检测apriltag
标签并计算标签的宽度, 参考代码:计算常量系数k
2.3.3. 通过常量系数计算摄像头和物体间的距离#
2.3.4. 完整的代码参考:#
上面的方法是通过apriltag
的宽度计算距离, 同样也可以扩展为使用高度来计算距离. 但需要注意该方法是在对距离估测, 实际应用中会有些许误差存在.
2.4. 测距2:利用apriltag标签测量物体到摄像头的距离#
通过apriltag
标签测距,可以比较准确的测量标签在空间中的位置,这里我们也利用find_apriltag()
方法返回的参数来计算任意位置的apriltag
标签到摄像头的位置,当然前提是你必须检测到apriltag
标签。
测量方法共两步:1. 计算常量系数k。2.通过find_apriltag()
返回的位置信息计算标签到摄像头的距离
优点:可以在apriltag
标签旋转、与摄像头有偏移的情况测量出标签到摄像头的距离
2.4.1. 前期准备#
apriltag
标签纸- 尺子(或其他测距工具)
2.4.2. 测量常量系数#
将
apriltag
标签纸固定,并在距离apriltag
标签20cm处固定maixcam
使用
maixcam
检测apriltag
标签并通过z_translation
计算常量系数, 参考代码:
2.4.3. 测量标签到物体的距离#
通过
apriltag
标签返回的x_translation
,y_translation
和z_translation
计算标签到摄像头的距离
2.4.4. 完整的代码参考:#
这段代码使用 MaixCAM
不断读取摄像头图像,检测 apriltag
,并通过常量系数以及标签在三个轴向的位移计算标签到摄像头的距离。计算出的距离以毫米为单位打印出来, 需要注意该方法仍是在对距离估测, 实际应用中会有些许误差存在。