Opencv_CUDA应用之 关键点检测器和描述符
- 本节中会介绍找到局部特征的各种方法,也被称为关键点检测器
- 关键点(key-point)是表征图像的特征点,可用于准确定义对象
1. 加速段测试特征功能检测器
- FAST算法用于检测角点作为图像的关键点,通过对每个像素应用分段测试来检测角点(corner),对每个像素以半径16像素形成的圆作为分段。如果在半径16的圆中有n个连续点强度大于
Ip+t
或者小于Ip-t
,那么该像素被认为是一个角点。Ip
是 p
处的像素强度,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);
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);
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关键点和描述符,如下: