这些是Aprilrobotics开发的Apriltags 3库的Python绑定。受马特·扎克(Matt Zucker)的Apriltags2绑定的启发。
原始库是使用BSD 2-CORAESE许可证发布的。
您可以使用pip
安装(或python 3的pip3
):
pip install dt-apriltags
如果您想要特定的版本,请这样添加:
pip install [email protected]
克隆此存储库并在其中导航。然后初始化Apriltags子模块:
$ git submodule init
$ git submodule update
构建Apriltags C库,并将新建的库嵌入PIP轮中。
$ make build
新的车轮将在目录dist/
。您现在可以安装轮子
pip install dt_apriltags-VERSION-pyPYMAJOR-none-ARCH.whl
注意:基于此库的当前VERSION
和Python的版本使用了PYMAJOR
,以及您的CPU ARCH
的体系结构,上述文件名也有所不同。
该图书馆支持Python 2
和3
的建筑车轮。默认情况下将使用Python 2。使用以下命令为Python 3构建。
make build PYTHON_VERSION=3
该图书馆支持CPU架构amd64
, arm32v7
和arm64v8
的构建车轮。默认架构为amd64
。在为手臂架构构建车轮时,QEMU将用于模拟目标CPU。使用以下命令为arm32v7
体系结构构建。
make build ARCH=arm32v7
可以通过运行命令来释放所有dist/
内部构建的车轮(将其推向pypi.org)
make upload
使用以下命令为Python 2和3和CPU Architecture amd64
和arm32v7
构建和释放车轮。
make release-all
在test.py
文件中可以看到一些用法的示例。 Detector
类是围绕Apriltags功能的包装器。您可以将其初始化如下:
at_detector = Detector(searchpath=['apriltags'],
families='tag36h11',
nthreads=1,
quad_decimate=1.0,
quad_sigma=0.0,
refine_edges=1,
decode_sharpening=0.25,
debug=0)
选项是:
选项 | 默认 | 解释 |
---|---|---|
家庭 | 'tag36H11' | 标记家庭,与空间分开 |
nthreads | 1 | 线程数 |
max_hamming | 2 | 允许翻转以生成成功的标签检测的最大位数。当噪声导致某些数据位错误地读取时,可以帮助减少虚假负数,但也可以增加误报。 |
quad_decimate | 2.0 | 可以在较低分辨率的图像上检测四边形,以姿势准确性的成本提高速度,并且检测率略有下降。解码二进制有效载荷仍以完全分辨率完成。将其设置为1.0以使用完整的分辨率。 |
quad_sigma | 0.0 | 高斯的模糊应应用于分段图像。参数是像素中的标准偏差。非常嘈杂的图像受益于非零值(例如0.8) |
Refine_edges | 1 | 当非零时,将每个四边形的边缘调整为“快照”到附近的强梯度。当采用拆卸时,这很有用,因为它可以大大提高初始四分之一估计的质量。通常建议使用(1)。计算上很便宜。如果quad_decimation = 1,将忽略选项 |
decode_sharpening | 0.25 | 解码图像应进行多少锐化?这可以有助于解码小标签,但在奇怪的照明条件或低光条件下可能会有所帮助 |
搜索路径 | ['apriltags'] | 在哪里查找Apriltag 3库,必须是列表 |
调试 | 0 | 如果1,将保存调试图像。运行非常慢 |
图像中标签的检测是通过运行检测器的detect
方法完成的:
tags = at_detector.detect(img, estimate_tag_pose=False, camera_params=None, tag_size=None)
如果您还想提取标签姿势,则应将estimate_tag_pose
设置为True
和camera_params
( [fx, fy, cx, cy]
)和tag_size
(以米为单位)。该detect
方法返回一个Detection
对象列表,每个检测对象每个具有以下属性(请注意,只有在estimate_tag_pose=True
时才能计算带有星号的对象列表:
属性 | 解释 |
---|---|
tag_family | 标签的家族。 |
tag_id | 标签的解码ID。 |
锤子 | 纠正了多少位错误位?注意:接受大量校正错误会导致误报率大大提高。注意:在此实现之后,检测器无法检测锤距大于3的标签。 |
deciest_margin | 二进制解码过程质量的度量:数据位强度与决策阈值之间的平均差异。较高的数字大致表示更好的解码。这是仅针对非常小的标签的合理量度测量准确性 - 对于较大的标签无效(我们可以在一个位单元中在任何地方进行采样,并且仍然获得良好的检测。 |
同型 | 3x3同型矩阵描述了“理想”标签的投影(在(-1,1),(1,1),(1,1,-1)和(-1,-1))到像素中的像素图像。 |
中心 | 图像像素坐标中检测的中心。 |
角落 | 图像像素坐标中标签的角落。这些总是在标签上缠绕反对锁定。 |
pose_r* | 姿势估计的旋转矩阵。 |
pose_t* | 姿势估计的翻译。 |
pose_err* | 估计的对象空间误差。 |
如果要使用自定义布局,则需要为其创建C源和标头文件,然后再次构建库。然后使用新的libapriltag.so
库。您可以找到有关原始Apriltags存储库的更多信息。
车轮建在码头容器内部。该存储库根中的Dockerfile是构建环境的模板。构建环境基于ubuntu:18.04
,正确版本的Python即时安装。如果在构建车轮之前不存在, make build
命令将创建构建环境。
构建环境(Docker Image)准备就绪后,将启动一个Docker容器,并具有以下配置:
/source
;dist/
将其安装为目标目录下/out
的目的目录; assets/build.sh
的构建脚本将在容器内执行。构建步骤是:
/source
复制到临时位置(容器内部)apriltags/
构建apriltag库(将产生.SO库文件)package_data
)/out
(将弹出在容器dist/
外部 /外部)