OpenCV之特征检测(二) 快速特征检测

 Fast特征检测,特点是速度很快,只需要对比几个像素,就可以判断是否为关键点。
          OpenCV提供的调用接口也很方便
          vector<KeyPoint> keypoints;
          int threshold = 100;
          Ptr<FeatureDetector> fastDetector = FastFeatureDetector::create(threshold);
          fastDetector->detect(image,keypoints);
          
         可以看下OpenCV提供的FastFeatureDetector::create的原型:
    CV_WRAP static Ptr < FastFeatureDetector > create( int threshold =10, bool nonmaxSuppression = true , FastFeatureDetector :: DetectorType type = FastFeatureDetector :: TYPE_9_16 )
        Fast特征检测的原理很简单,但是经过了一系列的演化,为了描述清楚,我从最原始的思路开始说起。
        以图像上任意一点为圆心,做一个圆,如果圆弧上有连续3/4个点的灰度值,明显大于或者小于中心点灰度值(阈值控制),则认为中心点为特征点。如果我们取圆弧上的四个特殊点,分别为垂直方向的上下两个点和水平方向的左右两个点,如果要满足上面的条件,必须满足中心点大于或者小于这四个点中的连续三个点,否则肯定不是角点,根据这一特点,可以排除大量的点,从而大大减少计算量。
例如下图,0为中心点,其它标数字的都是圆弧上的点,1,9,13,5是圆弧上的四个特殊点。圆弧上总的点数是16,3/4的点个数应该为12,但是最后根据经验,把连续线段长度减少为9,可以使对图像的角点检测有更好的重复性。其实对于其它半径,最后检测的连续线段都做了简化,不再是最初定义的3/4。
根据上面所述,圆的半径应该是一个参数,其实这个参数再 create方法的第三个参数做了体现。
create方法第三个参数默认为 FastFeatureDetector :: TYPE_9_16,什么意思呢?16是圆弧上的总点数,9为实际检测的连续点的个数这个对应半径为3的情况。
如下是OpenCV对DetectorType定义
enum DetectorType
    {
        TYPE_5_8 = 0, TYPE_7_12 = 1, TYPE_9_16 = 2
    };
 
TYPE5_5_8 对应半径为1的情况,TYPE_7_12对应半径为2的情况。
 
 
int fast_threshold = 50;
const int max_threshold = 300;
Mat img_object;
/** @function main */
void fast_feature_detector(int,void*)
{
    vector<KeyPoint> keypoints;
    Ptr<FeatureDetector> fastDetector = FastFeatureDetector::create(fast_threshold);
    fastDetector->detect(img_object, keypoints);
    Mat img_keypoints;
    drawKeypoints(img_object, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    cv::imshow("image keypoints", img_keypoints);
   
}
int main(int argc, char** argv)
{
    img_object = imread("./box.png", CV_LOAD_IMAGE_GRAYSCALE); 
    namedWindow("image keypoints");
    createTrackbar("Threshold","image keypoints",&fast_threshold, max_threshold, fast_feature_detector);
    fast_feature_detector(0, 0);
    waitKey(0);
}
 
threshold越大特征点越少,反之,特征点越多,如果threshold大于255,取threshold的后8bits。
 
 
使用fast特征检测,threshold参数很关键,但是实际情况中不太容易确定,而且这个threshold是一个全局值,没有提供局部阈值的接口。fastDetector效果一般,不太建议使用。
 
OpenCV还提供了一些附加工具,适配特征点检测,这里不再赘述,参考DynamicAdaptedFeatureDetector,GridAdaptedFeatureDetector,:PyramidAdaptedFeatureDetector等的内容。
 
参考:
《OpenCV计算机视觉编程攻略(第2版)》  [加] Robert 著   相银初 译
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neil_baby

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值