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

OpenCv实战笔记(4)基于opencv实现ORB特征匹配检测

一、原理作用

ORB 原理(Oriented FAST and Rotated BRIEF):
特征点检测:使用 FAST 算法检测角点(关键点)。
方向计算:为每个关键点分配主方向,增强旋转不变性。
特征描述:使用 BRIEF(快速二进制描述符),通过图像灰度比较构造描述子。
描述子旋转:将 BRIEF 描述子旋转对齐主方向,增强旋转鲁棒性。
ORB作用
提取图像中稳定、重复性强的关键点;生成可用于图像匹配、识别、跟踪的紧凑二进制描述子。
应用场景:图像匹配(如拼接、全景)、 SLAM / 视觉里程计(机器人/无人车定位)、物体识别与检测、图像配准与对齐、图像检索

二、实现效果
在这里插入图片描述三、参考代码

void demo(const cv::Mat& img1, const cv::Mat& img2, cv::Mat& outputImg) {if (img1.empty() || img2.empty()) {std::cerr << "[feature_matching] Error: Input images are empty." << std::endl;return;}cv::Ptr<cv::ORB> orb = cv::ORB::create();std::vector<cv::KeyPoint> kp1, kp2;cv::Mat desc1, desc2;orb->detectAndCompute(img1, cv::noArray(), kp1, desc1);orb->detectAndCompute(img2, cv::noArray(), kp2, desc2);if (desc1.empty() || desc2.empty()) {std::cerr << "[feature_matching] Warning: Descriptor computation failed." << std::endl;return;}cv::BFMatcher matcher(cv::NORM_HAMMING);std::vector<std::vector<cv::DMatch>> knn_matches;matcher.knnMatch(desc1, desc2, knn_matches, 2);std::vector<cv::DMatch> good_matches;for (const auto& m : knn_matches) {if (m.size() >= 2 && m[0].distance < 0.75f * m[1].distance) {good_matches.push_back(m[0]);}}cv::drawMatches(img1, kp1, img2, kp2, good_matches, outputImg);
}
//应用
void MainWindow::sltOrb()
{// 加载两张灰度图像cv::Mat img1 = cv::imread("img1.jpg", cv::IMREAD_GRAYSCALE);cv::Mat img2 = cv::imread("img2.jpg", cv::IMREAD_GRAYSCALE);cv::Mat output;// 调用封装好的 ORB 特征匹配函数feature_matching::demo(img1, img2, output);// 显示结果图像if (!output.empty()) {cv::imshow("Feature Matching Result", output);cv::waitKey(0);}
}

欢迎关注我,一起交流!

http://www.xdnf.cn/news/370333.html

相关文章:

  • Web3 初学者的第一个实战项目:留言上链 DApp
  • 协议路由与路由协议
  • 【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
  • PXE_Kickstart_无人值守自动化安装系统
  • 物业企业绩效考核制度与考核体系
  • 前端弹性布局:用Flexbox构建现代网页的魔法指南
  • vue2 上传pdf,拖拽盖章,下载图片
  • 前端开发实战:用React Hooks优化你的组件性能
  • [C] 第10章 预处理命令
  • LeetCode热题100--240.搜索二维矩阵--中等
  • 达索MODSIM实施成本高吗?哪家服务商靠谱?
  • 思考:(linux) tmux 超级终端快速入门的宏观思维
  • Java—— 集合 List
  • 程序代码篇---Python视频流
  • JSON|cJSON 介绍以及具体项目编写
  • STM32CUBEIDE开发实战:ADC与UART应用
  • 网络原理(Java)
  • 使用python脚本连接SQL Server数据库导出表结构
  • 解决虚拟机挂起之后的网络问题
  • 鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK
  • 单片机-STM32部分:11、ADC
  • MCP项目实例 - client sever交互
  • Python+OpenCV打造AR/VR基础框架:从原理到实战的全链路解析
  • Kotlin高阶函数多态场景条件判断与子逻辑
  • Android 13 默认打开 使用屏幕键盘
  • macOS 15.4.1 Chrome不能访问本地网络
  • 深入解析C++11 auto 关键字:类型推导的现代实践
  • 青藏高原七大河流源区径流深、蒸散发数据集(TPRED)
  • PCB设计实践(十二)PCB设计电容选型:功能、材质、规则
  • C++发起Https连接请求