SLAM: 图像角点检测的Fast算法(OpenCV文档)
原文链接:http://blog.csdn.net/candycat1992/article/details/22285979
本文做了少量修改,并添加了C++代码,若有疑问或者版权问题,请拜读作者或者通知本人。
目标
- 理解FAST算法的基本原理
- 使用OpenCV的FAST函数进行角点(corners)检测
原理
learning for high-speed corner detection”(在2010年再次被修订)中被提出。下面是该算法的一个基本总结。你可以参见原论文去学习更多的细节(下面所有的图片是从原论文中提取的)。
使用FAST进行特征检测
- 从图片中选取一个像素点Pi,下面我们将判断它是否是一个特征点。我们首先把它的密度(即像素值)设为I_p。
- 设定一个合适的阙值T。
- 考虑该像素点周围的16个像素。(见下图)
- 现在,如果在这个大小为16个像素的圆上有n 个连续的像素点,它们的像素值要么都比I_p+T大,要么都比I_p-T小,那么它就是一个角点。(如上图中白色虚线所示)。n 这里被设定为12。
- 我们现在应该提出一个高效的测试,来快速排除一大部分是非角点的点。该测试仅仅检查在位置1、9、5和13四个位置的像素(首先检查1和9,看它们是否亮于或暗于阙值。如果是,再检查5和13)。如果Pi是一个角点,那么上述四个像素点中至少有3个应该必须都大于I_p +T 或者小于I_p-
T(因为若是一个角点,超过四分之三个圆的部分应该满足判断条件,半圆比包含上述某三个点)。如果都不满足,那么Pi 不可能是一个角点。完整的分段测试可以被用于接受的所有候选点,通过检测圆上的所有点。这种检测有很好的性能,但是有一些缺点:
1. 当n < 12时不能拒绝许多候选点。
2. 检测出来的角点不是最优的,这是因为它的效率是依靠角点外形的排列和分布的。
3.
4. 相邻的多个特征点会被检测到。
suppression。
机器学习
- 选择一个图片集合进行学习(最好是来自于目标应用定义域)。
- 在每一张图上运行FAST算法,找到特征点。
- 对于每个特征点,存储它周围的16个像素点到一个vector中。为所有的图片做同样的事,得到它们所有特征点的vector P。
- 这16个像素中的每一个像素(假设为x),可以有下面三种状态中的一种:
- 依靠这些状态,特征向量P被划分为3个子集,P_d,P_s,P_b。
- 定义一个新的布尔变量,K_p。如果P是一个角点,那些K_p为真;否则为假。
- 使用ID3算法(决策树分类器)来查询每一个子集。
- 递归计算所有的子集直到它的嫡为0。
- 被创建的决策树就被用于其他图片的fast检测。
non-maximal suppression
suppression来解决。
- 为每一个检测到的特征点计算它的分数函数(score function),V。V是
P 和它周围16个像素点的绝对偏差的和。 - 考虑两个相邻的特征点,并比较它们的v值。
- v 值较低的点将会被剔除。
总结
OpenCV中的FAST特征检测
- cv2.FAST_FEATURE_DETECTOR_TYPE_5_8
- cv2.FAST_FEATURE_DETECTOR_TYPE_7_12
- cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
import numpy as np
import cv2
from matplotlib import pyplot as plt img = cv2.imread('simple.jpg',0) # Initiate FAST object with default values
fast = cv2.FastFeatureDetector() # find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv2.drawKeypoints(img, kp, color=(255,0,0)) # Print all default params
print "Threshold: ", fast.getInt('threshold')
print "nonmaxSuppression: ", fast.getBool('nonmaxSuppression')
print "neighborhood: ", fast.getInt('type')
print "Total Keypoints with nonmaxSuppression: ", len(kp) cv2.imwrite('fast_true.png',img2) # Disable nonmaxSuppression
fast.setBool('nonmaxSuppression',0)
kp = fast.detect(img,None) print "Total Keypoints without nonmaxSuppression: ", len(kp) img3 = cv2.drawKeypoints(img, kp, color=(255,0,0)) cv2.imwrite('fast_false.png',img3)
C++代码段:
int CEkfSlam::fast_corner_detect_9(
cv::Mat &im, double threshold, std::vector<CvPoint> &coords)
{
//提取快速角点//一次只提取一个角点?//且有时可能会不发现角点,可能一次有多个角点 cv::Mat image(im.rows, im.cols, 1);
if (3== im.channels() ){
cv::cvtColor (im,image,CV_BGR2GRAY);
}
else{
image =im.clone();
} //快速角点检测
std::vector<cv::KeyPoint> keypoints;
cv::FAST(image,keypoints,threshold,true); //默认开启极大值抑制!
coords.resize(keypoints.size() );
//cv::imshow("kp",image);cv::waitKey(0);
for (int i=0;i< keypoints.size();++i){
coords[i].x =keypoints[i].pt.x;
coords[i].y =keypoints[i].pt.y;
} return 1;
}
值得注意的是,下面的写法会出现内存问题:
cv::FastFeatureDetector fast(threshold, true);
fast.detect(image, allKeypoints[0]);</del>
下面是测试结果。左边是使用了nonmaxSuppression的FAST,右边则没有使用。
SLAM: 图像角点检测的Fast算法(OpenCV文档)的更多相关文章
- SLAM: 图像角点检测的Fast算法(时间阈值实验)
作为角点检测的一种快速方法,FastCornerDetect算法比Harris方法.SIft方法都要快一些,应用于实时性要求较高的场合,可以直接应用于SLAM的随机匹配过程.算法来源于2006年的Ed ...
- 【OpenCV文档】用于角点检测的Fast算法
原文地址:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm- ...
- OpenCV-Python 用于角点检测的FAST算法 | 四十一
目标 在本章中, 我们将了解FAST算法的基础知识. 我们将使用OpenCV功能对FAST算法进行探索. 理论 我们看到了几个特征检测器,其中很多真的很棒.但是,从实时应用程序的角度来看,它们不够快. ...
- 深入学习OpenCV文档扫描及OCR识别(文档扫描,图像矫正,透视变换,OCR识别)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
- 编译OpenCV文档
概述 使用OpenCV的过程中经常查看文档,每次都去官网查看,不过国内访问速度很慢,有一份本地的文档就好了.本文列出了在Linux(Fedora)系统上从OpenCV源码编译出documentatio ...
- NLP传统基础(1)---BM25算法---计算文档和query相关性
一.简介:TF-IDF 的改进算法 https://blog.csdn.net/weixin_41090915/article/details/79053584 bm25 是一种用来评价搜索词和文档之 ...
- RSA 算法-MSDN文档
RSA 算法 若要生成密钥对,可以从创建名为 p 和 q 的两个大的质数开始. 这两个数相乘,结果称为 n. 因为 p 和 q 都是质数,所以 n 的全部因数为 1. p. q 和 n. 如果仅考虑小 ...
- Kmeans文档聚类算法实现之python
实现文档聚类的总体思想: 将每个文档的关键词提取,形成一个关键词集合N: 将每个文档向量化,可以参看计算余弦相似度那一章: 给定K个聚类中心,使用Kmeans算法处理向量: 分析每个聚类中心的相关文档 ...
- OPENCV图像特征点检测与FAST检测算法
前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...
随机推荐
- hdu_1013_Digital Roots_201310121652
Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- [转]十五天精通WCF——终结篇 那些你需要注意的坑
终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果 不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧. 一: 第 ...
- iOS: 两句话给UILabel添加下划线
1. 将UILabel控件的Text属性设为Attributed 2. 在viewDidLoad方法中添加如下语句: NSDictionary *underlineAttribute = @{NSUn ...
- Intellij Idea 13:重置设置
最近在将Windows下的Idea的设置导入到Mac下的时候,一时手贱,点了全部结果发现悲剧了,所有的快捷键都变成和Windows的一样了.于是我就在CMD+C,V和Ctrl+C,V中不断的进行头脑锻 ...
- linux 下ip命令对比ifconfig命令
原文:https://linux.cn/article-3144-1.html ------------------------------------------------------------ ...
- 迭代器和iter()函数
1.先来个样例,有个初步的印象: myTuple=(123,'xyz',45.67) i=iter(myTuple) i.next() 123 i.next() 'xyz' i.next() 45.6 ...
- 从头认识Spring-2.7 自己主动检測Bean(1)-@Component @Repository @Service @Controller
这一章节我们来讨论一下自己主动检測Bean. 1.domain 厨师类: package com.raylee.my_new_spring.my_new_spring.ch02.topic_1_19; ...
- 在Win7中修改 系统盘中 “系统” - “用户” 的环境变量映射关系
1.在此列表中,选中对应登录帐号 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 2.将Prof ...
- C# SuperWebSocket服务端学习(二)
首先需要下载DLL类库 地址详见:http://download.csdn.NET/detail/u011269801/9590935 1,打开VS2012,新建一个控制台应用程序,选择.NET4. ...
- BNUOJ ->Borrow Classroom(LCA)
B. Borrow Classroom Time Limit: 5000ms Memory Limit: 262144KB 每年的BNU校赛都会有两次赛前培训,为此就需要去借教室,由于SK同学忙于出题 ...