视觉SLAM十四讲(三)——cmake编译过程

本文深入剖析代码执行流程,从基本概念出发,讲解执行流程的关键步骤,包括编译、解释、执行环境和调用栈,适合开发者理解程序运行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、代码执行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZG8oUVY-1636978399172)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0109a44d-a3af-4bf9-b3ba-0396d0aff27f/未命名文件_(1)].png)

### 关于《视觉SLAM十四》中与OpenCV相关的实现 在《视觉SLAM十四》一书中,OpenCV 是一个重要的工具库,用于处理图像数据以及完成一些基础的几何计算。以下是关于如何使用 OpenCV 的具体实现及其代码示例解析。 #### 1. 配置环境 为了使书中的代码能够正常运行,在配置 CMake 文件时需要特别注意 OpenCV 的路径设置[^4]。如果未正确指定 OpenCV 路径,则可能导致编译失败或其他错误。因此,建议按照以下方式修改 `CMakeLists.txt`: ```cmake set(OpenCV_DIR /usr/local/opencv3/share/OpenCV) find_package(OpenCV 3 REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) link_directories(${OpenCV_LIBRARY_DIRS}) add_executable(example example.cpp) target_link_libraries(example ${OpenCV_LIBS}) ``` 上述代码片段展示了如何通过 CMake 来链接 OpenCV 库并确保其被正确定位和加载。 --- #### 2. 图像读取与显示 OpenCV 提供了强大的功能来操作图像文件。例如,可以利用它从摄像头捕获帧或者加载本地图片,并将其展示出来。下面是一个简单的例子说明这一过程: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("example.jpg", IMREAD_COLOR); // 加载彩色图像 if (image.empty()) { // 检查是否成功加载 std::cout << "Could not open or find the image!" << std::endl; return -1; } namedWindow("Display window", WINDOW_AUTOSIZE); imshow("Display window", image); waitKey(0); // 等待按键输入关闭窗口 destroyAllWindows(); } ``` 此段代码实现了基本的功能:加载一张名为 `"example.jpg"` 的图片到内存中,随后创建了一个新窗口并将该图片呈现给用户查看[^1]。 --- #### 3. 特征提取与匹配 特征检测是 SLAM 中非常核心的一个环节,《视觉SLAM十四》提到多种方法可用于描述局部区域特性,比如 ORB、FAST 和 SIFT 等算法。这里给出基于 ORB 描述子的关键点检测及匹配流程: ```cpp Ptr<ORB> orb = ORB::create(); // 创建 ORB 对象实例 vector<KeyPoint> keypoints_1, keypoints_2; // 存储两幅图上的关键点集合 Mat descriptors_1, descriptors_2; // 存放对应的描述符矩阵 orb->detectAndCompute(image_1, noArray(), keypoints_1, descriptors_1); orb->detectAndCompute(image_2, noArray(), keypoints_2, descriptors_2); BFMatcher matcher(NORM_HAMMING); // 使用暴力匹配器进行最近邻查找 vector<DMatch> matches; matcher.match(descriptors_1, descriptors_2, matches); // 绘制前十个最佳匹配项作为结果可视化的一部分 Mat img_matches; drawMatches(image_1, keypoints_1, image_2, keypoints_2, vector<DMatch>(matches.begin(), matches.begin()+10), img_matches); imshow("Good Matches", img_matches); waitKey(0); destroyAllWindows(); ``` 以上代码完成了两个步骤的工作——首先是调用 ORB 方法分别获取两张不同视角下的兴趣点位置;其次是借助 BFMatcher 类型寻找最接近的一组对应关系[^2]。 --- #### 4. 基础矩阵估计 当已知若干对匹配好的像素坐标之后,就可以进一步估算它们之间的本质联系形式即 **F**(Fundamental Matrix)。这一步骤对于后续恢复维结构至关重要: ```cpp std::vector<Point2f> points1(matches.size()), points2(matches.size()); for(int i=0;i<(int)matches.size();i++) { points1[i]=keypoints_1[matches[i].queryIdx].pt; points2[i]=keypoints_2[matches[i].trainIdx].pt; } Mat fundamental_matrix = findFundamentalMat(points1, points2, FM_RANSAC ); if(fundamental_matrix.type()==CV_64F){ fundamental_matrix.convertTo(fundamental_matrix,CV_32F); } printf("\n Fundamental matrix:\n%s\n",cv::format(fundamental_matrix,"matlab").c_str()); ``` 在这里我们采用 RANSAC 技术剔除异常值干扰从而提高鲁棒性[^3]。 --- ### 总结 综上所述,围绕着《视觉SLAM十四》,介绍了几个典型场景下涉及 OpenCV 工具包的具体应用案例分析。这些涵盖了项目初始化准备阶段的操作指南、实际开发过程中常见的任务需求解决办法等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值