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