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

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.xdnf.cn/news/7809.html

相关文章:

  • WPF核心类继承树结构
  • 学习路之uniapp--unipush2.0推送功能--服务端推送消息
  • Java安全-Servlet内存马
  • 基于多传感器融合的智能驾驶环境感知系统
  • 【java第19集】java面向对象编程详解
  • MyBatis:简化数据库操作的持久层框架
  • 高噪声下扩展边缘检测算子对检测边缘的影响
  • windows powershell 判断 进程号是否存在
  • 无人机桥梁巡检
  • linux文件重命名命令
  • MIL-C-5015航空插头2芯震动加速度传感器连接器
  • 五、【API 开发篇(下)】:使用 Django REST Framework构建测试用例模型的 CRUD API
  • 云原生安全之PaaS:从基础到实践的技术指南
  • 谈谈 Kotlin 中的构造方法,有哪些注意事项?
  • 【Django系统】Python+Django携程酒店评论情感分析系统
  • 【Java微服务组件】异步通信P2—Kafka与消息
  • [杂学笔记]浏览器多进程与多线程架构、wstring类型、哈希表、红黑树与哈希表的对比、C++标准库Random类
  • 影响镍钯金PCB表面处理价格的因素有哪些?
  • Spring事务简单操作
  • 【低代码】如何使用明道云调用 Flask 视图函数并传参(POST 方法实践)
  • vue-cli 构建打包优化(JeecgBoot-Vue2 配置优化篇)
  • Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决
  • digitalworld.local: FALL靶场
  • Mysql-数据闪回工具MyFlash
  • SQL查询, 响应体临时字段报: Unknown column ‘data_json_map‘ in ‘field list‘
  • leetcode 92. Reverse Linked List II
  • 张 Prompt Tuning--中文数据准确率提升:理性与冲动识别新突破
  • 分类算法 Kmeans、KNN、Meanshift 实战
  • maven之pom.xml
  • 【25软考网工】第七章(3) UOS Linux防火墙配置和Web应用服务配置