本博客內(nèi)容來源于網(wǎng)絡(luò)以及其他書籍约郁,結(jié)合自己學(xué)習(xí)的心得進(jìn)行重編輯蜡饵,因?yàn)榭戳撕芏辔恼虏槐阋灰粯?biāo)注引用烂瘫,如圖片文字等侵權(quán)精盅,請(qǐng)告知?jiǎng)h除帽哑。
學(xué)習(xí)筆記目錄----->傳送門 <-----
前言
有關(guān)角點(diǎn)的知識(shí)可以在Harris角點(diǎn)學(xué)習(xí)筆記中查看。雖然有很多的角點(diǎn)檢測(cè)算法渤弛,有一些也能夠達(dá)到實(shí)時(shí)祝拯,但是我們要在實(shí)時(shí)性更高的系統(tǒng)上使用甚带,比如vslam她肯,則需要更快點(diǎn)的角點(diǎn)提取算法,來為其他操作節(jié)省時(shí)間鹰贵。
那么Edward Rosten和Tom Drummond于2006年提出了一種FAST特征點(diǎn)檢測(cè)方法晴氨,并在2010年稍作修改后發(fā)表了《Features From Accelerated Segment Test》,簡(jiǎn)稱FAST(也確實(shí)是快碉输,優(yōu)秀的命名)籽前。接下來,我們?cè)敿?xì)解析一下FAST角點(diǎn)檢測(cè)方法
FAST角點(diǎn)檢測(cè)思路
FAST角點(diǎn)定義與合理性
總的來說FAST角點(diǎn)檢測(cè)還是比較簡(jiǎn)單的敷钾,那么讓我們來看看作者是怎么定義FAST角點(diǎn)的
- FAST角點(diǎn):若某像素與其周圍鄰域內(nèi)足夠多的像素點(diǎn)相差較大枝哄,則該像素可能是角點(diǎn)。
我們來看一個(gè)例子阻荒,幫助理解:
從上圖上我們可以看出挠锥,放大后的右圖中心像素點(diǎn)P的灰度值明顯要比周圍圓上的像素點(diǎn)1-16的灰度值要小,并且很多的像素值的相差比較大侨赡,則此點(diǎn)就有可能是角點(diǎn)蓖租。
這個(gè)通過對(duì)比平坦的圖以及邊緣圖還是比較好理解的,在平坦的圖上羊壹,周圍的像素點(diǎn)應(yīng)該和中心點(diǎn)的差距是比較斜突隆;在邊緣上油猫,周圍的像素點(diǎn)應(yīng)該一半差距比較大稠茂,一半基本上沒有差距;而在角點(diǎn)上情妖,應(yīng)該時(shí)大多數(shù)的差距比較大睬关,而少數(shù)的差距比較小嚣州。
所以提取特征點(diǎn),就是通過一定的特征劃分共螺,將不同的像素點(diǎn)分開该肴,屬于同一特征下的在某個(gè)維度具有極高的結(jié)構(gòu)或?qū)傩韵嗨菩浴?/p>
FAST算法流程
在上述我們理解FAST角點(diǎn)定義的合理性之后,我們來看一下藐不,F(xiàn)AST角點(diǎn)算法的流程匀哄,仍舊以上面的圖為例。
- 我們?nèi)耘f選擇一個(gè)點(diǎn)雏蛮,不妨仍設(shè)這個(gè)點(diǎn)為像素點(diǎn)P涎嚼。我們首先把它的亮度值設(shè)為Ip。
- 慮以該像素點(diǎn)為中心的一個(gè)半徑等于3像素的離散化的Bresenham圓挑秉,這個(gè)圓的邊界上有16個(gè)像素法梯,分別為p1 ~ p16,亮度值分別為Ip1 ~ Ip16犀概。
- 我們選定一個(gè)閾值t立哑,t做什么的我們接下來看。
- 首先計(jì)算p1姻灶、p9铛绰、p5、p13(分別在四個(gè)方向的四個(gè)點(diǎn))與中心p的像素差产喉,若它們的絕對(duì)值有至少3個(gè)超過閾值t捂掰,則當(dāng)做候選角點(diǎn),再進(jìn)行下一步考察曾沈;否則这嚣,不可能是角點(diǎn);
- 在p是候選點(diǎn)的情況下塞俱,計(jì)算p1到p16這16個(gè)點(diǎn)與中心p的像素差姐帚,若它們有至少連續(xù)9個(gè)超過閾值(也可以測(cè)試其他大小,實(shí)驗(yàn)表明9的效果更好)敛腌,則是角點(diǎn)卧土;否則,不是角點(diǎn)像樊。
- 對(duì)完整圖進(jìn)行1-5 的角點(diǎn)判斷尤莺。
-
對(duì)完整圖像進(jìn)行非極大值抑制,目的去除小區(qū)域內(nèi)多個(gè)重復(fù)的特征點(diǎn):
7.3. 得分計(jì)算公式如下(公式中用V表示得分或详,t表示閾值):
7.1. 計(jì)算特征點(diǎn)出的FAST得分值(或者說響應(yīng)值)生棍,即16個(gè)點(diǎn)與中心差值的絕對(duì)值總和颤霎。
7.2. 判斷以特征點(diǎn)p為中心的一個(gè)鄰域(可以設(shè)為3x3或著5x5)內(nèi),若有多個(gè)特征點(diǎn),則判斷每個(gè)特征點(diǎn)的響應(yīng)值,如果p是其中最大的友酱,則保留晴音,否則,刪除缔杉。如果只有一個(gè)特征點(diǎn)锤躁,就保留。
FAST角點(diǎn)檢測(cè)性能
可以看出FAST特征點(diǎn)的計(jì)算方式非常簡(jiǎn)單系羞,計(jì)算速度也是相對(duì)于其他方式也是非常快的霸琴,但是還是有一些缺點(diǎn):
- 在首先的四點(diǎn)檢測(cè)里椒振,只有2個(gè)點(diǎn)同中心點(diǎn)不相似,也并不能說明這不是角點(diǎn)(我們是不是可以在這優(yōu)化一下梧乘,保留更多的角點(diǎn))澎迎。
- 前面的四點(diǎn)檢測(cè)結(jié)果和后面的16點(diǎn)檢測(cè)的計(jì)算有一定重復(fù)。
- 檢測(cè)出來的角點(diǎn)不一定是最優(yōu)的选调,這是因?yàn)樗男嗜Q于問題的排序與角點(diǎn)的分布夹供。
雖然FAST有一些缺點(diǎn),但并不妨礙FAST角點(diǎn)檢測(cè)学歧,是一個(gè)優(yōu)秀的方法罩引,其中使用最常見的就是為其他特征點(diǎn)的提取,進(jìn)行快速的過濾枝笨。比如先進(jìn)性FAST特征提取,在進(jìn)行Harris角點(diǎn)去揭蜒,就可以加快横浑,整個(gè)Harris角點(diǎn)提取的速度了。 再比如在ORB-SLAM中屉更,orb特征點(diǎn)的提取就依賴了FAST角點(diǎn)提取的快速穩(wěn)定徙融。在之后我們會(huì)講解關(guān)于ORB特征點(diǎn)的提取。
OpenCV 使用中FAST角點(diǎn)檢測(cè)效果[代碼]
#include <iostream>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
int thread_value = 30;
cv::Mat orignal_image = cv::imread (argv[1]);
cv::Mat gray_image , after_fast_image;
cv::cvtColor (orignal_image,gray_image,CV_BGR2GRAY); // 灰度變換
std::vector<cv::KeyPoint> keypoints;
cv::FAST(gray_image, keypoints,thread_value);
cv::drawKeypoints(orignal_image, keypoints, after_fast_image, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT);
cv::imshow("after_fast_corner", after_fast_image);
cv::imwrite("after_fast_corner.png",after_fast_image);
cv::waitKey(0);
return 0;
}
下面是我自己選的一張圖出來的效果瑰谜,可以看到在角點(diǎn)檢測(cè)的效果還是不錯(cuò)的欺冀,角點(diǎn)的地方還是找的比較密集的,當(dāng)然和閾值的設(shè)置也有關(guān)系萨脑,可以去對(duì)比我Harris的效果去做對(duì)比隐轩。
重要的事情說三遍:
如果您看到我的文章對(duì)您有所幫助,那就點(diǎn)個(gè)贊唄 ( * ^ __ ^ * )
如果您看到我的文章對(duì)您有所幫助渤早,那就點(diǎn)個(gè)贊唄( * ^ __ ^ * )
如果您看到我的文章對(duì)您有所幫助职车,那就點(diǎn)個(gè)贊唄( * ^ __ ^ * )
傳統(tǒng)2D計(jì)算機(jī)視覺學(xué)習(xí)筆記目錄傳送門
傳統(tǒng)3D計(jì)算機(jī)視覺學(xué)習(xí)筆記目錄傳送門
任何人或團(tuán)體、機(jī)構(gòu)全部轉(zhuǎn)載或者部分轉(zhuǎn)載、摘錄悴灵,請(qǐng)保留本博客鏈接或標(biāo)注來源扛芽。博客地址:開飛機(jī)的喬巴
作者簡(jiǎn)介:開飛機(jī)的喬巴(WeChat:zhangzheng-thu),現(xiàn)主要從事機(jī)器人抓取視覺系統(tǒng)以及三維重建等3D視覺相關(guān)方面积瞒,另外對(duì)slam以及深度學(xué)習(xí)技術(shù)也頗感興趣川尖,歡迎加我微信或留言交流相關(guān)工作。