[20] Opencv_CUDA应用之 关键点检测器和描述符

发布于:2024-06-26 ⋅ 阅读:(30) ⋅ 点赞:(0)

Opencv_CUDA应用之 关键点检测器和描述符

  • 本节中会介绍找到局部特征的各种方法,也被称为关键点检测器
  • 关键点(key-point)是表征图像的特征点,可用于准确定义对象

1. 加速段测试特征功能检测器

  • FAST算法用于检测角点作为图像的关键点,通过对每个像素应用分段测试来检测角点(corner),对每个像素以半径16像素形成的圆作为分段。如果在半径16的圆中有n个连续点强度大于Ip+t或者小于Ip-t,那么该像素被认为是一个角点。Ipp处的像素强度,t是所选择的阈值。
  • opencv和cuda提供了一种实现FAST算法的有效方法,如下所示:
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudafeatures2d.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat h_image = imread("images/drawing.JPG", 0);

	//Detect the keypoints using FAST Detector
	cv::Ptr<cv::cuda::FastFeatureDetector> detector = cv::cuda::FastFeatureDetector::create(100, true, 2);
	std::vector<cv::KeyPoint> keypoints;
	cv::cuda::GpuMat d_image;
	d_image.upload(h_image);
	detector->detect(d_image, keypoints);
	cv::drawKeypoints(h_image, keypoints, h_image);
	//Show detected keypoints
	cv::namedWindow("Final Result", 0);
	imshow("Final Result", h_image);
	waitKey(0);
	return 0;
}

在这里插入图片描述

2. 面向FAST和旋转BRIEF 的特征检测

  • ORB是一种非常有效的特征检测和描述算法,结合FAST特征检测算法和二进制鲁棒独立初级特征(Binary Robust Independent Elementary Features, BRIEF),提供一种有效替代目前广泛用于对象检测的SURF和SIFT算法,要使用这两个有专利保护的算法是需要付费的。
  • ORB是免费的,而且能匹配SIFT和SURF的性能。
  • Opencv 和 CUDA 提供了一个简单的API 来实现ORB算法,用于实现ORB算法的代码如下:
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudafeatures2d.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat h_image = imread("images/drawing.JPG", 0);
	cv::Ptr<cv::cuda::ORB> detector = cv::cuda::ORB::create();
	std::vector<cv::KeyPoint> keypoints;
	cv::cuda::GpuMat d_image;
	d_image.upload(h_image);
	detector->detect(d_image, keypoints);
	cv::drawKeypoints(h_image, keypoints, h_image);
	imshow("Final Result", h_image);
	waitKey(0);
	return 0;
}

在这里插入图片描述

3. 加速强特征检测和匹配

在这里插入图片描述

  • opencv和cuda提供了一个API来计算SURF关键点和描述符,如下:
    在这里插入图片描述