室内定位---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。