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关键点和描述符,如下: