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

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;
}

运行结果

在这里插入图片描述

相关文章:

  • 嵌入式学习的第二十五天-系统编程-文件相关函数-标准I0+文件IO
  • 视觉生成新突破!仅0.5B参数,SimpleAR解锁预训练、SFT、RL全能模式
  • 使用 Vue 展示 Markdown 文本
  • 【Java高阶面经:微服务篇】7. 1秒响应保障:超时控制如何成为高并发系统的“救火队长”?
  • 期刊采编系统安装升级错误
  • 软考 系统架构设计师系列知识点之杂项集萃(66)
  • Nginx负载均衡配置详解
  • 回溯算法——排列篇
  • 阿里云ecs 8核 16G 内存 装有redis6 分配了3G内存,和2个tomcat 每个tomcat 4G 服务器反应迟钝,如何确认不是redis的问题
  • web.py使用时报错AttributeError: No template named image_window
  • RTMP协议解析【二】
  • 下一代电子电气架构(EEA)的关键技术
  • 运行时runtime是什么?(程序在运行过程中所依赖的环境、资源管理机制以及动态行为的总和)(包括内存分配、异常处理、线程调度、类型检查、资源访问等)
  • RAG知识库SentenceSplitter分段问题分析与优化方案
  • 操作系统理解(xv6)
  • NC028NQ472美光固态颗粒NQ484NQ485
  • 第五章 GPT模块配置
  • centos系统redis-dump安装
  • FPGA开发全流程
  • bitbar环境搭建(ruby 2.4 + rails 5.0.2)
  • 素材网站无水印/免费域名的网站
  • 东营企业网站制作/台州网站制作维护
  • 网站建设方案撰写/上海百度seo牛巨微
  • 设计公司起名怎么起好/全国推广优化网站
  • 品牌建设管理办法/提高seo关键词排名
  • 公司注册网站官网/2023年的新闻十条