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

OpenCV CUDA模块特征检测与描述------一种基于快速特征点检测和旋转不变的二进制描述符类cv::cuda::ORB

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::cuda::ORB 是 OpenCV 库中 CUDA 模块的一部分,它提供了一种基于快速特征点检测和旋转不变的二进制描述符的方法,用于在 GPU 上执行高效的特征匹配。ORB(Oriented FAST and Rotated BRIEF)是为了解决FAST特征点缺乏方向性以及BRIEF描述符对旋转不敏感的问题而提出的。

主要功能

  • 特征点检测:利用改进的FAST算法来检测图像中的关键点,并为其分配一个主方向。
  • 描述符计算:通过旋转BRIEF描述符来生成具有旋转不变性的描述符。
  • GPU加速:所有操作均在GPU上进行,以加快处理速度。

主要成员函数

以下是 cv::cuda::ORB 提供的一些主要接口:

创建ORB实例

  static Ptr<ORB> create(int nfeatures = 500, float scaleFactor = 1.2f, int nlevels = 8, int edgeThreshold = 31, int firstLevel = 0, int WTA_K = 2, int scoreType = ORB::HARRIS_SCORE, int patchSize = 31,int fastThreshold = 20)

创建一个 cv::cuda::ORB 实例。
参数包括特征点的最大数量、比例因子、金字塔层数等。

检测特征点

  void detect(cv::InputArray image, cv::Ptr<cv::cuda::GpuMat>& keypoints, cv::cuda::Stream& stream = cv::cuda::Stream::Null())

在给定图像中检测特征点。

  • image: 输入图像(通常是灰度图)。
  • keypoints: 输出的关键点集合。
  • stream: CUDA 流对象,默认为同步流。

计算描述符

 void compute(cv::InputArray image, cv::Ptr<cv::cuda::GpuMat>& keypoints, cv::cuda::GpuMat& descriptors, cv::cuda::Stream& stream = cv::cuda::Stream::Null())

根据检测到的特征点计算描述符。

  • descriptors: 输出的描述符矩阵。

同时检测并计算描述符

void detectAndCompute
(cv::InputArray image, cv::InputArray mask, cv::Ptr<cv::cuda::GpuMat>& keypoints, cv::cuda::GpuMat& descriptors, bool useProvidedKeypoints, cv::cuda::Stream& stream = cv::cuda::Stream::Null()
)

同时执行特征点检测和描述符计算。

  • mask: 可选参数,指定感兴趣区域。
  • useProvidedKeypoints: 如果为 true,则仅对提供的关键点计算描述符;否则先检测关键点再计算描述符。

代码示例

#include <opencv2/cudafeatures2d.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>int main()
{// 读取图像cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE );if ( h_img.empty() ){std::cerr << "Error: Image not found!" << std::endl;return -1;}// 上传到 GPUcv::cuda::GpuMat d_img;d_img.upload( h_img );// 创建 CUDA ORB 检测器cv::Ptr< cv::cuda::ORB > orb = cv::cuda::ORB::create( 500 );  // 最多检测500个关键点// 存储关键点(在主机上)std::vector< cv::KeyPoint > h_keypoints;// 存储描述符(在设备上)cv::cuda::GpuMat d_descriptors;// 检测关键点orb->detect( d_img, h_keypoints );// 计算描述符orb->compute( d_img, h_keypoints, d_descriptors );// 将描述符下载到主机内存(如果需要进一步处理或保存)cv::Mat h_descriptors;d_descriptors.download( h_descriptors );// 绘制结果cv::Mat outImg;cv::drawKeypoints( h_img, h_keypoints, outImg, cv::Scalar::all( -1 ), cv::DrawMatchesFlags::DEFAULT );// 显示结果cv::imshow( "ORB Keypoints (CUDA)", outImg );cv::waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

http://www.lryc.cn/news/2385422.html

相关文章:

  • Awesome ChatGPT Prompts:释放AI对话潜力的开源利器
  • Prompt Tuning:轻量级微调与反向传播揭秘
  • C++ 继承详解:基础篇(含代码示例)
  • PP-YOLOE-SOD学习笔记2
  • OpenLayers 加载测量控件
  • .NET ORM开发手册:基于SqlSugar的高效数据访问全攻略
  • 【PostgreSQL】数据探查工具1.0研发可行性方案
  • C++ 内存管理与单例模式剖析
  • 算法学习——从零实现循环神经网络
  • win10使用nginx做简单负载均衡测试
  • 2025电工杯数学建模B题思路数模AI提示词工程
  • 软考软件评测师——软件工程之开发模型与方法
  • 前端表单中 `readOnly` 和 `disabled` 属性的区别
  • 【日志软件】hoo wintail 的替代
  • OceanBase数据库全面指南(基础入门篇)
  • 异步处理与事件驱动中的模型调用链设计
  • redis配置带验证的主从复制
  • Ollama-OCR:基于Ollama多模态大模型的端到端文档解析和处理
  • OpenCV CUDA 模块中图像过滤------创建一个拉普拉斯(Laplacian)滤波器函数createLaplacianFilter()
  • 图论学习笔记 3
  • 在单片机中如何在断电前将数据保存至DataFlash?
  • 【将WPS设置为默认打开方式】--突然无法用WPS打开文件
  • 电子人的分水岭-FPGA模电和数电
  • (6)python爬虫--selenium
  • Python之两个爬虫案例实战(澎湃新闻+网易每日简报):附源码+解释
  • HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
  • 系统安全及应用学习笔记
  • STC89C52RC/LE52RC
  • ✨ PLSQL卡顿优化
  • yum命令常用选项