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

[复制链接]
发表于 2025-9-16 20:24:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 利用体系: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实例
  1.   static Ptr<ORB> create
  2.   (
  3.           int nfeatures = 500,
  4.           float scaleFactor = 1.2f,
  5.           int nlevels = 8,
  6.           int edgeThreshold = 31,
  7.           int firstLevel = 0,
  8.           int WTA_K = 2,
  9.           int scoreType = ORB::HARRIS_SCORE,
  10.           int patchSize = 31,
  11.           int fastThreshold = 20
  12.   )
复制代码
创建一个 cv::cuda::ORB 实例。
参数包罗特性点的最大数量、比例因子、金字塔层数等。
检测特性点
  1.   void detect
  2.   (
  3.           cv::InputArray image,
  4.           cv::Ptr<cv::cuda::GpuMat>& keypoints,
  5.           cv::cuda::Stream& stream = cv::cuda::Stream::Null()
  6.   )
复制代码
在给定图像中检测特性点。

  • image: 输入图像(通常是灰度图)。
  • keypoints: 输出的关键点聚集。
  • stream: CUDA 流对象,默认为同步流。
盘算描述符
  1. void compute
  2. (
  3.            cv::InputArray image,
  4.            cv::Ptr<cv::cuda::GpuMat>& keypoints,
  5.            cv::cuda::GpuMat& descriptors,
  6.            cv::cuda::Stream& stream = cv::cuda::Stream::Null()
  7. )
复制代码
根据检测到的特性点盘算描述符。

  • descriptors: 输出的描述符矩阵。
同时检测并盘算描述符
  1. void detectAndCompute
  2. (
  3.         cv::InputArray image,
  4.         cv::InputArray mask,
  5.         cv::Ptr<cv::cuda::GpuMat>& keypoints,
  6.         cv::cuda::GpuMat& descriptors,
  7.         bool useProvidedKeypoints,
  8.         cv::cuda::Stream& stream = cv::cuda::Stream::Null()
  9. )
复制代码
同时实行特性点检测和描述符盘算。

  • mask: 可选参数,指定感兴趣地域。
  • useProvidedKeypoints: 如果为 true,则仅对提供的关键点盘算描述符;否则先检测关键点再盘算描述符。
代码示例
  1. #include <opencv2/cudafeatures2d.hpp>
  2. #include <opencv2/cudaimgproc.hpp>
  3. #include <opencv2/opencv.hpp>
  4. int main()
  5. {
  6.     // 读取图像
  7.     cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE );
  8.     if ( h_img.empty() )
  9.     {
  10.         std::cerr << "Error: Image not found!" << std::endl;
  11.         return -1;
  12.     }
  13.     // 上传到 GPU
  14.     cv::cuda::GpuMat d_img;
  15.     d_img.upload( h_img );
  16.     // 创建 CUDA ORB 检测器
  17.     cv::Ptr< cv::cuda::ORB > orb = cv::cuda::ORB::create( 500 );  // 最多检测500个关键点
  18.     // 存储关键点(在主机上)
  19.     std::vector< cv::KeyPoint > h_keypoints;
  20.     // 存储描述符(在设备上)
  21.     cv::cuda::GpuMat d_descriptors;
  22.     // 检测关键点
  23.     orb->detect( d_img, h_keypoints );
  24.     // 计算描述符
  25.     orb->compute( d_img, h_keypoints, d_descriptors );
  26.     // 将描述符下载到主机内存(如果需要进一步处理或保存)
  27.     cv::Mat h_descriptors;
  28.     d_descriptors.download( h_descriptors );
  29.     // 绘制结果
  30.     cv::Mat outImg;
  31.     cv::drawKeypoints( h_img, h_keypoints, outImg, cv::Scalar::all( -1 ), cv::DrawMatchesFlags::DEFAULT );
  32.     // 显示结果
  33.     cv::imshow( "ORB Keypoints (CUDA)", outImg );
  34.     cv::waitKey( 0 );
  35.     return 0;
  36. }
复制代码
运行效果


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表