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

室内定位---apriltag 视觉定位demo

apriltag 官方demo编译

https://github.com/AprilRobotics/apriltag

# 查看当前仓库的分支
git tag# 基于已经 release 的分支再拷贝一个分支
git checkout -b v3.4.5 v3.4.5cmake -B build -DCMAKE_BUILD_TYPE=Release
sudo cmake --build build --target install

此时发现编译的文件无法直接运行,apriltag_demo 会检测我们系统当中是有 opencv 的库,如果有的话,可以直接生成一个 opencv 的demo,直接调用摄像头等操作。

opencv 安装:
https://blog.csdn.net/weixin_44796670/article/details/115900538

安装好之后,将 apriltag 的build 文件删除,在重新编译即可。

最终获取的编译文件:直接运行 opencv_demo 就好了

~/01_code/03_aprilTag/apriltag/build$ ls
apriltag.cpython-310-x86_64-linux-gnu.so  apriltag_py_type_docstring.h  generated             libapriltag.so.3.4.5
apriltag_demo                             CMakeCache.txt                install_manifest.txt  Makefile
apriltag_detect_docstring.h               CMakeFiles                    libapriltag.so        opencv_demo
apriltag.pc                               cmake_install.cmake           libapriltag.so.3

默认识别的 Tag36h11 的 family。
分析对应的源码:

  • 'f', "family", "tag36h11", "Tag family to use", 默认识别的 family 是 tag36h11 。
  • 我们可以从 google 找几张 tag36h11 family 的照片来进行识别测试。
    getopt_t *getopt = getopt_create();getopt_add_bool(getopt, 'h', "help", 0, "Show this help");getopt_add_bool(getopt, 'd', "debug", 0, "Enable debugging output (slow)");getopt_add_bool(getopt, 'q', "quiet", 0, "Reduce output");getopt_add_string(getopt, 'f', "family", "tag36h11", "Tag family to use");getopt_add_int(getopt, 'i', "iters", "1", "Repeat processing on input set this many times");getopt_add_int(getopt, 't', "threads", "1", "Use this many CPU threads");getopt_add_int(getopt, 'a', "hamming", "1", "Detect tags with up to this many bit errors.");getopt_add_double(getopt, 'x', "decimate", "2.0", "Decimate input image by this factor");getopt_add_double(getopt, 'b', "blur", "0.0", "Apply low-pass blur to input; negative sharpens");getopt_add_bool(getopt, '0', "refine-edges", 1, "Spend more time trying to align edges of tags");if (!getopt_parse(getopt, argc, argv, 1) || getopt_get_bool(getopt, "help")) {printf("Usage: %s [options] <input files>\n", argv[0]);getopt_do_usage(getopt);exit(0);}

关键输出的数据结构: apriltag_detection_t

  • ID:决定位置,可以根据我们提前安排好的位置,来实现绝对位置的校准。
  • 中心点坐标:
  • 四个顶点坐标:
    在这里插入图片描述

Opencv 安装

安装教程,按照 https://blog.csdn.net/weixin_44796670/article/details/115900538 这个步骤就可以了,我在对一些关键步骤进行一下拆解。

make install

在opencv源码编译安装的时候, make install 会做点什么?(执行 makefile 的一个 install 目标)
在 OpenCV 里,make install(或者 ninja install)主要就是 把编译产物从 build 目录复制到安装目录。

make 阶段做了什么?

  • 编译 .cpp → .o(目标文件)
  • 链接生成 .so(共享库)或者 .a(静态库)
  • 生成可执行文件(比如 opencv_version)
  • 保存在 build 目录 下(比如 build/lib/, build/bin/, build/modules/)
  • 此时,所有东西都还只是“临时放在 build 目录里”,还不能直接系统使用。

make install 做了什么,具体分析 cmake_install.cmake 脚本做什么就行了:

  • 读取 CMake 的 install 规则,把编译好的库、头文件、配置文件,按规则复制到安装前缀目录(CMAKE_INSTALL_PREFIX,默认 /usr/local)。具体来说,OpenCV 会安装:
  • 共享库或者静态库:libopencv_core.so, libopencv_imgproc.so … --> 放到 /usr/local/lib
  • 头文件:opencv2/core.hpp, opencv2/imgproc.hpp … → 放到 /usr/local/include/opencv4/opencv2/
  • 工具/可执行文件:opencv_version, opencv_interactive-calibration, opencv_createsamples 等 → 放到 /usr/local/bin/
  • CMake 配置文件:OpenCVConfig.cmake, OpenCVModules.cmake → 放到 /usr/local/lib/cmake/opencv4/
    (以后其他 CMake 工程可以 find_package(OpenCV) 来找到它)
  • pkg-config 文件(如果开启了): opencv4.pc → 放到 /usr/local/lib/pkgconfig/(供 pkg-config --libs opencv4 使用)
  • Python/Java 绑定(如果编译时开启):cv2.so(Python 模块) → 安装到 Python 的 site-packages
  • Java jar 包 + JNI 动态库 → 安装到 /usr/local/share/java//usr/local/lib

opencv cmake_install 分析:默认前缀,拷贝的对应文件
在这里插入图片描述
在这里插入图片描述
sudo ldconfig:
为什么需要 ldconfig?

  • make install 把库文件复制到了 /usr/local/lib 或 /usr/local/lib64
  • 这些目录有时不在系统默认的动态库搜索路径 /etc/ld.so.conf 里。
  • 即使在默认路径,新的库文件拷进去后,动态链接器缓存里还没有记录。ldconfig 会:
  • 扫描 /lib, /usr/lib, /usr/local/lib 等路径
  • 更新 /etc/ld.so.cache(动态链接库缓存文件)
  • 建立 .so 符号链接(比如把 libopencv_core.so.4.9.0 链接成 libopencv_core.so.4.9 和 libopencv_core.so)
  • 这样,系统里的 g++、python cv2、或者你自己写的程序在运行时,才能顺利找到 OpenCV 的 .so。
http://www.xdnf.cn/news/1436689.html

相关文章:

  • (四)Python控制结构(条件结构)
  • deepseek7b本地部署技巧,新手也能玩得转
  • 下载 | Win11 官方精简版,系统占用空间极少!(8月更新、Win 11 IoT物联网 LTSC版、适合老电脑安装使用)
  • Flink RuntimeContext和FunctionContext:状态计算的核心桥梁
  • Linux中断实验
  • 数字化转型的终极关怀:以人为本
  • Linux笔记14——shell编程基础-8
  • C#类对象映射AutoMapper
  • QT(2)
  • MTK Linux DRM分析(二十九)- MTK mtk_dsi.c(Part.1)
  • Linux 环境配置 muduo 网络库详细步骤
  • Linux 文本处理三大利器:命令小工具和sed
  • 从理念到实践:三层解耦架构与“无系统”论
  • 基于web的高校学籍管理系统的设计与实现-(源码+LW+可部署)
  • CodeBuddy 在进化:我只输入了一个地址,完成了OneCode3.0基础开发环境的配置构建
  • JWT在线解密/JWT在线解码 - 加菲工具
  • kukekey在线搭建k8sV1.30.4版本
  • 从栈中取出K个硬币的最大面值和-分组背包
  • 【学Python自动化】 8. Python 错误和异常学习笔记
  • 2025年工科生职业发展证书选择与分析
  • 【模型学习】LoRA的原理,及deepseek-vl2下LoRA实现
  • 力扣242:有效的字母异位词
  • JetBrains 2025 全家桶 11合1 Windows直装(含 IDEA PyCharm、WebStorm、DataSpell、DataGrip等
  • C++类和对象(中)- 默认成员函数
  • 什么是数据库管理系统(DBMS)?RDBMS和NoSQL又是什么?
  • 第 2 讲:Kafka Topic 与 Partition 基础
  • Qwen3-Embedding-0.6B 模型结构
  • Go结构体详解:核心概念与实战技巧
  • Redis-底层数据结构篇
  • MySQL-表的约束(上)