SLAM OpenCV提取和匹配ORB特征
这个程序使用OpenCV提取和匹配图像的ORB特征。输入图片是两张不同视角拍摄的同一物体程序运行后先提取出第一张图片的ORB特征按任意键(比如空格)之后显示直接匹配ORB特征的结果可以看到有一些线和大多数线不平行出现了匹配错误。再按任意键之后过滤掉了匹配错误的连线代码#include iostream #include opencv2/core/core.hpp #include opencv2/features2d/features2d.hpp #include opencv2/highgui/highgui.hpp #include chrono using namespace std; using namespace cv; int main(int argc, char **argv) { if (argc ! 3) { cout usage: feature_extraction img1 img2 endl; return 1; } //-- 读取图像 Mat img_1 imread(argv[1], CV_LOAD_IMAGE_COLOR); Mat img_2 imread(argv[2], CV_LOAD_IMAGE_COLOR); assert(img_1.data ! nullptr img_2.data ! nullptr); //-- 初始化 std::vectorKeyPoint keypoints_1, keypoints_2; Mat descriptors_1, descriptors_2; PtrFeatureDetector detector ORB::create(); PtrDescriptorExtractor descriptor ORB::create(); PtrDescriptorMatcher matcher DescriptorMatcher::create(BruteForce-Hamming); //-- 第一步:检测 Oriented FAST 角点位置 chrono::steady_clock::time_point t1 chrono::steady_clock::now(); detector-detect(img_1, keypoints_1); detector-detect(img_2, keypoints_2); //-- 第二步:根据角点位置计算 BRIEF 描述子 descriptor-compute(img_1, keypoints_1, descriptors_1); descriptor-compute(img_2, keypoints_2, descriptors_2); chrono::steady_clock::time_point t2 chrono::steady_clock::now(); chrono::durationdouble time_used chrono::duration_castchrono::durationdouble(t2 - t1); cout extract ORB cost time_used.count() seconds. endl; Mat outimg1; drawKeypoints(img_1, keypoints_1, outimg1, Scalar::all(-1), DrawMatchesFlags::DEFAULT); imshow(ORB features, outimg1); //-- 第三步:对两幅图像中的BRIEF描述子进行匹配使用 Hamming 距离 vectorDMatch matches; t1 chrono::steady_clock::now(); matcher-match(descriptors_1, descriptors_2, matches); t2 chrono::steady_clock::now(); time_used chrono::duration_castchrono::durationdouble(t2 - t1); cout match ORB cost time_used.count() seconds. endl; //-- 第四步:匹配点对筛选 // 计算最小距离和最大距离 auto min_max minmax_element(matches.begin(), matches.end(), [](const DMatch m1, const DMatch m2) { return m1.distance m2.distance; }); double min_dist min_max.first-distance; double max_dist min_max.second-distance; printf(-- Max dist : %f \n, max_dist); printf(-- Min dist : %f \n, min_dist); //当描述子之间的距离大于两倍的最小距离时,即认为匹配有误.但有时候最小距离会非常小,设置一个经验值30作为下限. std::vectorDMatch good_matches; for (int i 0; i descriptors_1.rows; i) { if (matches[i].distance max(2 * min_dist, 30.0)) { good_matches.push_back(matches[i]); } } //-- 第五步:绘制匹配结果 Mat img_match; Mat img_goodmatch; drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_match); drawMatches(img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch); imshow(all matches, img_match); imshow(good matches, img_goodmatch); waitKey(0); return 0; }参考高翔《视觉SLAM十四讲》

相关新闻

原生鸿蒙像素画板实战 20:拼豆模板生成

原生鸿蒙像素画板实战 20:拼豆模板生成

拼豆图案很适合成为像素画编辑器的起点,因为它天生就是离散网格和有限颜色。但模板不能只是一张参考图:用户导入以后,希望得到的是可改色、可拆层、可继续导出的项目。bitArt 用字符矩阵描述模板,再把字符映射为颜色和像素数组&am…

2026/7/24 5:57:57 阅读更多 →
QMCDecode解密原理与实战:解锁QQ音乐加密格式的完整指南

QMCDecode解密原理与实战:解锁QQ音乐加密格式的完整指南

1. 项目概述:从一首无法播放的歌说起如果你是一个音乐爱好者,或者像我一样,喜欢把喜欢的歌曲下载到本地,建立一个属于自己的、不受平台限制的音乐库,那么你很可能遇到过一种令人沮丧的情况:从某个主流音乐平…

2026/7/24 5:57:57 阅读更多 →
RSA加密原理深度解析与CTF实战攻击手法全攻略

RSA加密原理深度解析与CTF实战攻击手法全攻略

1. 项目概述:为什么RSA是密码学的基石如果你对网络安全、编程或者CTF竞赛稍有接触,那么“RSA”这个名字你一定不陌生。它不仅仅是三个字母,更是现代密码学大厦的一块基石,从我们日常的HTTPS网站加密,到数字签名、软件授…

2026/7/24 5:57:57 阅读更多 →

最新新闻

C++ 23新特性解析:实用主义进化与工程实践指南

C++ 23新特性解析:实用主义进化与工程实践指南

1. C 23:一次聚焦“实用主义”的进化如果你和我一样,常年泡在C的代码堆里,对这门语言的每一次标准更新都保持着一种既期待又审慎的态度。期待的是新工具能让我们写出更安全、更高效、更优雅的代码;审慎的是,我们得掂量…

2026/7/24 6:07:00 阅读更多 →
C++入门:从Hello World理解编译器、链接器与开发环境搭建

C++入门:从Hello World理解编译器、链接器与开发环境搭建

1. 从“Hello World”开始&#xff1a;为什么它远不止一行代码 如果你刚打开电脑&#xff0c;准备踏入C的世界&#xff0c;大概率会从搜索引擎或教程里看到这样一行代码&#xff1a; cout << “Hello World” << endl; 。然后&#xff0c;教程会告诉你&#xff…

2026/7/24 6:07:00 阅读更多 →
自回归与Seq2Seq模型:核心差异与应用场景解析

自回归与Seq2Seq模型:核心差异与应用场景解析

1. 自回归模型与序列到序列模型的核心差异1.1 模型架构的本质区别自回归模型&#xff08;如GPT系列&#xff09;采用单向注意力机制&#xff0c;每个时间步只能看到当前及之前的token。这种结构决定了它天然适合文本生成任务——就像人类写作时逐字思考的过程。我在实际使用GPT…

2026/7/24 6:07:00 阅读更多 →
BQ41Z50 AFE保护配置详解:从阈值计算到延时设置实战指南

BQ41Z50 AFE保护配置详解:从阈值计算到延时设置实战指南

1. 项目概述&#xff1a;为什么AFE保护配置是电池安全的生命线 在电池管理系统&#xff08;BMS&#xff09;的江湖里&#xff0c;模拟前端&#xff08;AFE&#xff09;芯片就像是守护电池组的“贴身保镖”。它的核心任务不是做复杂的算法&#xff0c;而是7x24小时不间断地“盯梢…

2026/7/24 6:06:00 阅读更多 →
TI bq27505阻抗跟踪电量计:高精度电池SOC估算原理与工程实践

TI bq27505阻抗跟踪电量计:高精度电池SOC估算原理与工程实践

1. 项目概述&#xff1a;为什么我们需要一颗“聪明”的电量计&#xff1f;在智能手机、平板电脑或者任何一款便携式设备上&#xff0c;那个小小的电池图标和百分比数字&#xff0c;几乎是我们判断设备还能“撑多久”的唯一依据。但你是否曾疑惑过&#xff0c;为什么有时电量从1…

2026/7/24 6:06:00 阅读更多 →
计算机毕业设计之基于SpringBoot的汽车零件销售管理系统

计算机毕业设计之基于SpringBoot的汽车零件销售管理系统

随着汽车行业的蓬勃发展&#xff0c;对汽车零件的高效管理与销售成为提升市场竞争力的关键。本系统采用Java语言开发&#xff0c;结合SpringBoot框架与Vue前端技术&#xff0c;构建了一个功能全面的汽车零件销售管理系统。系统后端基于SpringBoot&#xff0c;以其简洁高效、易于…

2026/7/24 6:06:00 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化&#xff0c;核心特色&#xff1a;三维 X/Y/Z 三轴空间&#xff0c;所有散点分布在 0~10 立方体空间内&#xff1b;散点使用径向渐变实现立体 3D 圆球质感&#xff1b;支持鼠标 / 触屏拖拽画布&#xff0c;…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls&#xff1a;进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值&#xff0c;并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻